EnumPrinters function fails for Remote printers

0

I am trying to get network printer Details (I have network printers on my LAN). This is working for PRINTER_ENUM_LOCAL. But when try to get PRINTER_ENUM_REMOTE or PRINTER_ENUM_NETWORK the EnumPrinters() function fails (cbNeeded become 0)

What could possibly goes wrong.

I reffer http://www.pinvoke.net/default.aspx/winspool.enumprinters and https://msdn.microsoft.com/en-us/library/windows/desktop/dd162692(v=vs.85).aspx

public class PrnSpool
{
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool EnumPrinters(PrinterEnumFlags Flags, string Name, uint Level, IntPtr pPrinterEnum, uint cbBuf, ref uint pcbNeeded, ref uint pcReturned);

    private const int ERROR_INSUFFICIENT_BUFFER = 122;

    public static PRINTER_INFO_1[] enumPrinters1(PrinterEnumFlags Flags)
    {
        uint cbNeeded = 0;
        uint cReturned = 0;
        if (EnumPrinters(Flags, null, 1, IntPtr.Zero, 0, ref cbNeeded, ref cReturned))
        {
            return null;
        }
        int lastWin32Error = Marshal.GetLastWin32Error();
        if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER)
        {
            IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
            if (EnumPrinters(Flags, null, 1, pAddr, cbNeeded, ref cbNeeded, ref cReturned))
            {
                PRINTER_INFO_1[] printerInfo1 = new PRINTER_INFO_1[cReturned];
                long offset = pAddr.ToInt64();
                Type type = typeof(PRINTER_INFO_1);
                int increment = Marshal.SizeOf(type);
                for (int i = 0; i < cReturned; i++)
                {
                    printerInfo1[i] = (PRINTER_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type);
                    offset += increment;
                }
                Marshal.FreeHGlobal(pAddr);
                return printerInfo1;
            }
            lastWin32Error = Marshal.GetLastWin32Error();
        }
        throw new Win32Exception(lastWin32Error);
    }

}

public struct PRINTER_INFO_1
{
    uint Flags;
    string pDescription;
    string pName;
    string pComment;
}

[FlagsAttribute]
public enum PrinterEnumFlags
{
    PRINTER_ENUM_DEFAULT = 0x00000001,
    PRINTER_ENUM_LOCAL = 0x00000002,
    PRINTER_ENUM_CONNECTIONS = 0x00000004,
    PRINTER_ENUM_FAVORITE = 0x00000004,
    PRINTER_ENUM_NAME = 0x00000008,
    PRINTER_ENUM_REMOTE = 0x00000010,
    PRINTER_ENUM_SHARED = 0x00000020,
    PRINTER_ENUM_NETWORK = 0x00000040,
}

}

c#
printing
asked on Stack Overflow Jul 28, 2017 by mhs

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0