根据给定作业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;
}