private static extern bool EnumPrinters([MarshalAs(UnmanagedType.U4)] PRINTER_ENUM flags, [MarshalAs(UnmanagedType.LPStr)] string sName, uint iLevel, IntPtr pPrinterDesc, uint iSize, [MarshalAs(UnmanagedType.U4)] ref uint iNeeded, [MarshalAs(UnmanagedType.U4)] ref uint iReturned );
private static extern bool EnumPrinters(PRINTER_ENUM Flags, string Name, int Level, IntPtr pPrinterEnum, int cbBuf, out int pcbNeeded, out int pcReturned);
public PrinterInfo[] Search(PRINTER_ENUM printerKind) { PrinterInfo[] pInfo = new PrinterInfo[0]; uint iNeeded = 0, iReturned = 0, iSize = 0; IntPtr printers = IntPtr.Zero; if (!EnumPrinters(printerKind, String.Empty, 1, printers, 0, ref iNeeded, ref iReturned)) { //返回由上一个非托管函数返回的错误代码,该函数是使用设置了 - //DllImport属性中SetLastError=true 标志的平台调用来调用的 int err = Marshal.GetLastWin32Error(); if (err != Win32Error.ERROR_INSUFFICIENT_BUFFER) { ThrowEnumPrinterException(); } } iSize = iNeeded; if (iNeeded != 0) { try { //使用AllocHGlobal分配非托管内块 printers = Marshal.AllocHGlobal(new IntPtr(iSize)); //如果调用不成功抛出异常 if (!EnumPrinters(printerKind, String.Empty, 1, printers, iSize, ref iNeeded, ref iReturned)) { ThrowEnumPrinterException(); } else { pInfo = GetPrinterInfoFromMemory(printers, iReturned); } } finally { //释放分配的内存块 if (printers != IntPtr.Zero) { Marshal.FreeHGlobal(printers); } } } return(pInfo); }
private static extern bool EnumPrinters(PRINTER_ENUM Flags, string Name, int Level, IntPtr pPrinterEnum, int cbBuf, out int pcbNeeded, out int pcReturned);