Esempio n. 1
0
        ///<summary>
        /// Obtain a DEVMODE from a printer
        ///</summary>
        ///<param name="pHandle">Printer handle</param>
        ///<param name="baseType">Type of DEVMODE (printer default or user default)</param>
        ///<param name="devModeBytes">DEVMODE bytes</param>
        ///<returns>False if the call fails</returns>
        private DevMode GetDEVMODE(BaseDevModeType baseType)
        {
            DevMode result;

            switch (baseType)
            {
            case BaseDevModeType.PrinterDefault:
            {
                PRINTER_INFO_2 info = GetPrinterInfo2W();
                result = info.pDevMode;
                break;
            }

            case BaseDevModeType.UserDefault:
            {
                PRINTER_INFO_8_AND_9 info = GetPrinterInfo8Or9W(true);
                if (info.pDevMode != null)
                {
                    result = info.pDevMode;
                }
                else
                {
                    // No user default devmode, try the printer default, which is
                    // effectively the user default if their isn't a per user default
                    // overriding it.
                    result = GetDEVMODE(BaseDevModeType.PrinterDefault);
                }

                break;
            }

            default:
            {
                throw new ArgumentOutOfRangeException("baseType");
            }
            }

            if (result == null)
            {
                throw new PrintSystemException();
            }

            return(result);
        }
Esempio n. 2
0
            /// <summary>
            /// A callback that copies PRINTER_INFO_8_AND_9 fields from an unmanaged buffer
            /// </summary>
            public void Callback(HGlobalBuffer pPrinterBuffer)
            {
                // PRINTER_INFO_8 layout from http://msdn.microsoft.com/en-us/library/dd162851(VS.85).aspx
                //
                // typedef struct _PRINTER_INFO_8 {
                //  LPDEVMODE pDevMode;
                // } PRINTER_INFO_8, *PPRINTER_INFO_8;
                //
                // PRINTER_INFO_9 layout from http://msdn.microsoft.com/en-us/library/dd162852(VS.85).aspx
                //
                // typedef struct _PRINTER_INFO_9 {
                //  LPDEVMODE pDevMode;
                // } PRINTER_INFO_9, *PPRINTER_INFO_9;

                //  LPDEVMODE pDevMode;

                PRINTER_INFO_8_AND_9 = new PRINTER_INFO_8_AND_9();

                bool shouldRelease = false;

                pPrinterBuffer.Handle.DangerousAddRef(ref shouldRelease);
                try
                {
                    IntPtr pDevMode = Marshal.ReadIntPtr(pPrinterBuffer.Handle.DangerousGetHandle());
                    if (pDevMode != IntPtr.Zero)
                    {
                        PRINTER_INFO_8_AND_9.pDevMode = DevMode.FromIntPtr(pDevMode);
                    }
                }
                finally
                {
                    if (shouldRelease)
                    {
                        pPrinterBuffer.Handle.DangerousRelease();
                    }
                }
            }