0

根据给定作业ID的undocprint,应该可以使用格式为“PrinterName,Job xxxx”的字符串打开打印机来检索作业OpenPrinter的假脱机文件。MSDN 文档也列出了此方法,但在逗号“PrinterName, Job xxxx”之后有一个额外的空格ReadPrinter

每当我尝试从我的测试应用程序(使用任一字符串格式)调用此方法时,我都会得到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 或类似的。

我还没有看到任何关于为什么会这样的文档(事实上,MSDN 文档声明这种传递NULL应该与请求 USE 访问权限相同),但它确实解决了我们测试中的问题。

于 2012-12-14T00:44:03.080 回答
0

权限。您是否以管理员权限运行?

于 2012-10-12T20:26:01.607 回答