我在用原始打印机助手 http://support.microsoft.com/kb/322091/en-us用于打印。它可以在 Windows 7 及之前的版本上正常运行。
当我们使用安装在 Windows 8 电脑上的打印机进行尝试时,它不起作用。
读完这篇文章后post https://stackoverflow.com/questions/19975988/windows-8-printing-postscript-file-programmatically我了解到我必须将 dataType 变量设置为“XPS_PASS”而不是“RAW”。顺便说一句,将其设置为“XPS_PASS”在 Windows 8 上运行良好。
但在我的环境中,还有 Windows 8、Windows 7 和 XP。
是否可以通过编程方式进行此切换?
如何在 Windows 7 及更低版本的操作系统中将 pDataType 变量设置为“RAW”,在 Windows 8 中将 pDataType 变量设置为“XPS_PASS”?
编辑:经过几个小时的谷歌挖掘我发现this http://support.microsoft.com/kb/2779300文章。这里说:
- 调用 GetPrinterDriver 以检索 DRIVER_INFO_8 结构。
- 检查 DRIVER_INFO_8::dwPrinterDriverAttributes 中的 PRINTER_DRIVER_XPS 标志。
-
根据是否存在选择数据类型
旗帜:
- 如果设置了该标志,则使用“XPS_PASS”
- 如果未设置标志,则使用“RAW”
我不熟悉非托管代码,但我尝试过以下操作:
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetPrinterDriver(IntPtr hPrinter, string pEnvironment, uint Level, IntPtr pDriverInfo, int cbBuf, out int pcbNeeded);
private static void GetPrinterDataType(IntPtr hPrinter )
{
IntPtr driverInfo = new IntPtr();
driverInfo = IntPtr.Zero;
int buf_len = 0;
int IntPtrSize = Marshal.SizeOf(typeof(IntPtr));
int a = GetPrinterDriver(hPrinter, "", 8, driverInfo, 0, out buf_len);
driverInfo = Marshal.AllocHGlobal(buf_len);
a = GetPrinterDriver(hPrinter, "", 8, driverInfo, buf_len, out buf_len);
for (int i = 0; i <= 24; i++)
{
if (i == 12 || i == 15 || i == 11 || i == 14)
continue;
IntPtr ptr = Marshal.ReadIntPtr(driverInfo, IntPtrSize * i);
Console.WriteLine("DRIVER INFO {0}: {1}", i, Marshal.PtrToStringUni(ptr));
}
}
我在 RawPrinterHelper 类的 OpenPrinter() 方法之后调用此方法。但 dwPrinterDriverAttributes(编号 21)为空。
难道我做错了什么?