[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool EnumPrintProcessors(string pName,string pEnvironment,UInt32 Level,IntPtr pPrintProcessorInfo,UInt32 cbBuf,
ref UInt32 cbNeeded, ref UInt32 cReturned);
Declare Function EnumPrintProcessors Lib "winspool.drv" (TODO) As TODO
None.
uint cbNeeded = 0;
uint cReturned = 0;
if (EnumPrintProcessors("","",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 (EnumPrintProcessors("", "", 1, pAddr, cbNeeded , ref cbNeeded, ref cReturned))
{
PRINTPROCESSOR_INFO_1[] printprocessorInfo1 = new PRINTPROCESSOR_INFO_1[cReturned];
int offset = pAddr.ToInt32();
Type type = typeof(PRINTPROCESSOR_INFO_1);
int increment = Marshal.SizeOf(type);
for (int i = 0; i < cReturned; i++)
{
printprocessorInfo1[i] = (PRINTPROCESSOR_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type);
offset += increment;
}
Marshal.FreeHGlobal(pAddr);
return printprocessorInfo1;
}
lastWin32Error = Marshal.GetLastWin32Error();
}