ジョブ ID を指定したundocprintによると、"PrinterName,Job xxxx" の形式の文字列を使用してプリンターを開き、OpenPrinter
ジョブのスプール ファイルを取得できるはずです。MSDNReadPrinter
のドキュメントにもこの方法が記載されていますが、コンマ "PrinterName, Job xxxx" の後にスペースが追加されています。
テスト アプリケーションから (いずれかの文字列形式を使用して) このメソッドを呼び出そうとすると、ERROR_ACCESS_DENIED
(Windows 8 x64) が返されます。これはなぜですか? また、これを機能させるにはどうすればよいですか?
管理者としてテスト アプリを実行していますが、ジョブやプリンターを一時停止したり、他の情報にアクセスしたりするのに問題はありません。
無効な ID の代わりに返されるため、使用している ID が有効であることはわかっていますERROR_INVALID_PRINTER_NAME
。
私が使用しているコード:
public static void OpenPrinter(String printerName,
ref IntPtr printerHandle,
ref PRINTER_DEFAULTS defaults) {
if (OpenPrinter(printerName, ref printerHandle, ref defaults) == 0) {
throw new Win32Exception(Marshal.GetLastWin32Error(),
string.Format("Error getting access to printer: {0}", printerName));
}
}
[DllImport("winspool.drv", EntryPoint = "OpenPrinterW", SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int OpenPrinter(String pPrinterName, ref IntPtr phPrinter, ref PRINTER_DEFAULTS pDefault);
[StructLayout(LayoutKind.Sequential)]
public struct PRINTER_DEFAULTS {
public IntPtr pDatatype;
public IntPtr pDevMode;
public uint DesiredAccess;
}