Exemple #1
0
        /// <summary>
        ///     Creates a new instance of <see cref="RawPrinterAccess" />.
        /// </summary>
        /// <param name="printerDevice"> The printer device. </param>
        /// <exception cref="ArgumentNullException"> <paramref name="printerDevice" /> is null. </exception>
        public RawPrinterAccess(PrinterDevice printerDevice)
        {
            if (printerDevice == null)
            {
                throw new ArgumentNullException(nameof(printerDevice));
            }

            this.PrinterDevice = printerDevice;

            this.PrinterHandle = IntPtr.Zero;
        }
Exemple #2
0
        public static PrinterDevice[] GetPrinters(PrinterTypes printerTypes)
        {
            PrinterEnumFlags flags = 0;

            if ((printerTypes & PrinterTypes.Local) == PrinterTypes.Local)
            {
                flags |= PrinterEnumFlags.PRINTER_ENUM_LOCAL;
            }

            if ((printerTypes & PrinterTypes.Remote) == PrinterTypes.Remote)
            {
                flags |= PrinterEnumFlags.PRINTER_ENUM_REMOTE;
            }

            uint cbNeeded  = 0;
            uint cReturned = 0;

            if (PrinterDevice.EnumPrinters((uint)flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned))
            {
                if (cbNeeded == 0)
                {
                    return(new PrinterDevice[0]);
                }
            }

            int errorCode = WindowsApi.GetLastErrorCode();

            if (errorCode == (int)WindowsError.ErrorInsufficientBuffer)
            {
                IntPtr pAddr = IntPtr.Zero;

                try
                {
                    pAddr = Marshal.AllocHGlobal((int)cbNeeded);

                    if (PrinterDevice.EnumPrinters((uint)flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned))
                    {
                        PRINTER_INFO_2[] printerInfo = new PRINTER_INFO_2[cReturned];

                        long address          = pAddr.ToInt64();
                        long addressIncrement = Marshal.SizeOf(typeof(PRINTER_INFO_2));

                        for (int i1 = 0; i1 < cReturned; i1++)
                        {
                            printerInfo[i1] =
                                (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(address), typeof(PRINTER_INFO_2));

                            address += addressIncrement;
                        }

                        return((from x in printerInfo
                                select new PrinterDevice(x)).ToArray());
                    }

                    errorCode = WindowsApi.GetLastErrorCode();
                }
                finally
                {
                    if (pAddr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(pAddr);
                    }
                }
            }

            string errorMessage = WindowsApi.GetErrorMessage(errorCode);

            throw new Win32Exception(errorCode, errorMessage);
        }