0

ジョブ 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;
}
4

2 に答える 2

2

それを通過するpDefaults必要がNULLあり、それからすべてが機能することがわかります。

これには、IntPtrなどを使用するようにextern定義を変更する必要があります。

なぜこれが発生するのかについてのドキュメントは見たことがありませんが(実際、MSDNのドキュメントには、このパスNULLはUSEアクセスの要求と同じである必要があると記載されています)、テストで問題が確実に修正されます。

于 2012-12-14T00:44:03.080 に答える
0

権限。管理者権限で実行していますか?

于 2012-10-12T20:26:01.607 に答える