static void Main(string[] args) { test(); MyEnumPrintersClass.PRINTER_INFO_1[] printers = MyEnumPrintersClass.MyEnumPrinters(MyEnumPrintersClass.PrinterEnumFlags.PRINTER_ENUM_REMOTE); foreach (MyEnumPrintersClass.PRINTER_INFO_1 printer in printers) { if (-1 == printer.pName.IndexOf("!!")) { Console.WriteLine(printer.pName); } else { uint cbNeeded = 0; uint cReturned = 0; IntPtr pPrInfo4 = IntPtr.Zero; uint size = 0; string pNewName = printer.pName; MyEnumPrintersClass.EnumPrinters(MyEnumPrintersClass.PrinterEnumFlags.PRINTER_ENUM_NAME, pNewName, 1, IntPtr.Zero, size, ref cbNeeded, ref cReturned); if (cbNeeded != 0) { pPrInfo4 = Marshal.AllocHGlobal((int)cbNeeded + 128); size = cbNeeded + 128; MyEnumPrintersClass.EnumPrinters(MyEnumPrintersClass.PrinterEnumFlags.PRINTER_ENUM_NAME, pNewName, 1, pPrInfo4, size, ref cbNeeded, ref cReturned); MyEnumPrintersClass.PRINTER_INFO_1[] printerInfo1 = new MyEnumPrintersClass.PRINTER_INFO_1[cReturned]; int offset = pPrInfo4.ToInt32(); Type type = typeof(MyEnumPrintersClass.PRINTER_INFO_1); int increment = Marshal.SizeOf(type); for (int i = 0; i < cReturned; i++) { printerInfo1[i] = (MyEnumPrintersClass.PRINTER_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type); offset += increment; Console.WriteLine(printerInfo1[i].pName); } Marshal.FreeHGlobal(pPrInfo4); } } } Console.ReadKey(); }