Я не думаю, что (пере) написание DLL - самый простой метод. Почему бы не использовать WMI для извлечения требуемой информации (в данном случае принтеров) ?
Следующий код предназначен для извлечения всех локально установленных принтеров:
(примеры кода заимствованы у здесь )
ManagementScope objScope = new ManagementScope(ManagementPath.DefaultPath); //For the local Access
objScope.Connect();
SelectQuery selectQuery = new SelectQuery();
selectQuery.QueryString = "Select * from win32_Printer";
ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
ManagementObjectCollection MOC = MOS.Get();
foreach (ManagementObject mo in MOC) {
listBox1.Items.Add(mo["Name"].ToString().ToUpper());
}
Чтобы узнать принтеры по всему домену, используйте:
ConnectionOptions objConnection = new ConnectionOptions();
objConnection.Username = "USERNAME";
objConnection.Password = "PASSWORD";
objConnection.Authority = "ntlmdomain:DDI"; //Where DDI is the name of my domain
// Make sure the user you specified have enough permission to access the resource.
ManagementScope objScope = new ManagementScope(@"\\10.0.0.4\root\cimv2",objConnection); //For the local Access
objScope.Connect();
SelectQuery selectQuery = new SelectQuery();
selectQuery.QueryString = "Select * from win32_Printer";
ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
ManagementObjectCollection MOC = MOS.Get();
foreach (ManagementObject mo in MOC) {
listBox1.Items.Add(mo["Name"].ToString().ToUpper());
}
Конечно, список не «фильтруется», как хотелось бы, поскольку вы не указали никаких критериев. Но я уверен, что теперь ты сможешь справиться сам.