Ejemplo n.º 1
0
        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

                                                );
Ejemplo n.º 2
0
 private static extern bool EnumPrinters(PRINTER_ENUM Flags, string Name, int Level, IntPtr pPrinterEnum, int cbBuf, out int pcbNeeded, out int pcReturned);
Ejemplo n.º 3
0
        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);