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,
}
}
User contributions licensed under CC BY-SA 3.0