マネージド コード (C#) からWin32 関数 EnumJobs ( http://msdn.microsoft.com/en-us/library/windows/desktop/dd162625(v=vs.85).aspx ) を呼び出しています。
[DllImport("Winspool.drv", SetLastError = true, EntryPoint = "EnumJobsA")]
public static extern bool EnumJobs(
IntPtr hPrinter, // handle to printer object
UInt32 FirstJob, // index of first job
UInt32 NoJobs, // number of jobs to enumerate
UInt32 Level, // information level
IntPtr pJob, // job information buffer
UInt32 cbBuf, // size of job information buffer
out UInt32 pcbNeeded, // bytes received or required
out UInt32 pcReturned // number of jobs received
);
EnumJobs(_printerHandle, 0, 99, 1, IntPtr.Zero, 0, out nBytesNeeded, out pcReturned);
JOB_INFO_1 を受信するようにレベル 1 を指定していますが、問題は、上記の関数が構造体ごとに 240 として nBytesNeeded を返すことですが、Marshal.SizeOf(typeof(JOB_INFO_1))
実行時にメモリ例外が発生するのは 64 バイトMarshal.PtrToStructure
です。構造体のバイトを手動でカウントすると64になるため、関数から240バイトの構造体を受け取っている理由について少し迷っています。洞察をいただければ幸いです。
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Unicode)]
public struct JOB_INFO_1
{
public UInt32 JobId;
public string pPrinterName;
public string pMachineName;
public string pUserName;
public string pDocument;
public string pDatatype;
public string pStatus;
public UInt32 Status;
public UInt32 Priority;
public UInt32 Position;
public UInt32 TotalPages;
public UInt32 PagesPrinted;
public SYSTEMTIME Submitted;
}