如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作?

2024-04-05

我在用原始打印机助手 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文章。这里说:

  1. 调用 GetPrinterDriver 以检索 DRIVER_INFO_8 结构。
  2. 检查 DRIVER_INFO_8::dwPrinterDriverAttributes 中的 PRINTER_DRIVER_XPS 标志。
  3. 根据是否存在选择数据类型 旗帜:

    • 如果设置了该标志,则使用“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)为空。

难道我做错了什么?


好的,我已经设法弄清楚如何获取 dwPrinterDriverAttributes 字段的显示值。

我将 DRIVER_INFO_8 结构的定义添加到我的解决方案中(发现here http://www.pinvoke.net/default.aspx/winspool/DRIVER_INFO_8.html).

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DRIVER_INFO_8
{
    public uint cVersion;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pName;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pEnvironment;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pDriverPath;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pDataFile;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pConfigFile;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pHelpFile;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pDependentFiles;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pMonitorName;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pDefaultDataType;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszzPreviousNames;
    FILETIME ftDriverDate;
    UInt64 dwlDriverVersion;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszMfgName;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszOEMUrl;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszHardwareID;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszProvider;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszPrintProcessor;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszVendorSetup;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszzColorProfiles;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszInfPath;
    public uint dwPrinterDriverAttributes;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszzCoreDriverDependencies;
    FILETIME ftMinInboxDriverVerDate;
    UInt64 dwlMinInboxDriverVerVersion;
}

然后我将这行代码添加到上面的 GetPrinterDriverDataType() 方法中:

var info = (DRIVER_INFO_8)Marshal.PtrToStructure(driverInfo, typeof(DRIVER_INFO_8));

现在您将能够看到 dwPrinterDriverAttributes 字段填充的内容。

编辑:将 dwPrinterDriverAttributes 的保护级别更新为公共,以便可以访问/查看。

还值得注意这一点(发现here http://msdn.microsoft.com/en-us/library/cc244841.aspx):

dwPrinterDriverAttributes: A bit field that specifies attributes of the printer driver.

因此,我已将 uint 转换为 BitArray 并检查是否设置了 PRINTER_DRIVER_XPS 标志/位。

i.e.

PRINTER_DRIVER_XPS flag = 0x00000002

所以我们需要检查第二位。我通过以下方式做到这一点:

var value = (int)info.dwPrinterDriverAttributes;
BitArray b = new BitArray(new int[] { value } );
bool[] bits = new bool[b.Count];
b.CopyTo(bits, 0);

if (bits[1]) 
    Console.WriteLine("flag set");
else
    Console.WriteLine("flag not set");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作? 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • java.lang.IllegalStateException:找不到工厂javax.faces.application.ApplicationFactory的备份[重复]

    这个问题在这里已经有答案了 我想从 jsf 2 1 迁移到 2 2 但无法运行我的服务器 Tomcat 导致出现以下错误 我谨通知您 我在项目 Maven 中使用了 Hibernate Spring JSF Root WebApplicat
  • Windows 7 中 NASM 程序中的 I/O

    我想用 NASM 汇编语言进行编程 我有 NASM 2 07 和 Borland C 编译器 5 0 bcc32 我的操作系统是Windows 7 我不知道如何在Windows平台上使用NASM进行输入和输出 请问你能帮我吗 最简单的方法是
  • 调试 javascript 有哪些好的技巧? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 所以我相当经常地使用 JavaScr
  • 关于C++类中typedef函数的疑问

    我需要定义一个返回类对象的函数 假设我有一个名为狗的类 h 中的类声明和 cpp 中的实现 当狗死时 我想调用一个函数让狗管理器知道这一点 在dog的SetFunc中我将收到要调用的函数 Dog h class Dog public typ
  • 从插件 (.so) 加载 Qt UI(带图像)时遇到问题

    我有一个插件 可以加载并显示一个自定义小部件 该小部件显示从资源文件 resources qrc 加载的图像 作为 QLabel 的背景 我面临的问题是 加载插件后 它会正确显示小部件 但不显示图像 我尝试将 Q INIT RESOURCE
  • Safari 上的 Flex-wrap 问题

    我试图让两个元素填充其容器并在达到某个最小尺寸时进行包装 我的代码在除 safari 之外的所有浏览器上都能完美运行 而且我无法找到替代方案 这似乎是 flex basis 0 的问题 问题是这样的 http www cssdesk com
  • 错误:“grep:参数列表太长”[重复]

    这个问题在这里已经有答案了 我正在尝试运行以下命令 但出现参数太长错误 你能帮我吗 HOST grep rl pattern home public html bash bin grep Argument list too long 有没有
  • Hadoop - 如何收集没有值的文本输出

    我正在从事地图缩减工作 我想知道是否可以向我的输出文件发出自定义字符串 没有计数 没有其他数量 只有一团文本 这是我正在思考的基本想法 public static class Map extends MapReduceBase implem
  • VueJS 和 Laravel 的 Textarea v-model 初始值

    我想使用刀片语法将用户名显示为 Markdown 编辑器的默认文本区域值
  • 自动滚动 JavaFX TextFlow

    我有一个 JavaFXTextFlow包裹在一个ScrollPane 我试图让它在有新内容时自动滚动到底部Text被添加到TextFlow 我尝试过附加监听器以最大化ScrollPane s vvalue to The ScrollPane
  • Rails 包含查询,其条件不返回左表中的所有结果

    我有两个表格 帖子和图像 以下是 schema rb 中的相关部分 create table posts force true do t t string name t string body t datetime created at t
  • 更新张量流中的张量切片

    我想更新 3 维张量的切片 下列的如何在 Tensorflow 中进行切片分配 https stackoverflow com questions 39157723 how to do slice assignment in tensorf
  • 我可以使用QTimer来实现多线程算法吗?

    目前我需要实现一个基于Qt的多线程算法 也许我应该尝试延长QThread 但在此之前 我想问一下 我是否可以只使用两个QTimers timer1 timer2 并将它们的超时信号分别连接到线程上 来实现一个 假 的多线程程序 您可以连接
  • WCF 中的两个接口和一个具体类

    请检查下面的示例 namespace GServices ServiceKnownType typeof SearchType ServiceContract SessionMode SessionMode Allowed public i
  • 组合两张地图

    Scala 中是否有一个函数可以组合两个映射 或者 flatMap 是一个明智的方法吗 scala gt val caps Map String Int Map A 1 B 2 caps Map String Int Map A gt 1
  • tinypng.org 如何压缩 PNG 文件? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http tinypng org http tinypng org 是一项很棒的服务 他们将我的 png 图像优化了约 67 他们的服务如何运作 他们
  • React.js使用axios将数据发布到php,但php echo为空

    我正在使用react js axios和PHP将数据发布到MySQL数据库 这是我的react js代码 sendData var data new FormData data append name jessie data append
  • 如何开发依赖的 Composer 包而不需要提交或发布更改?

    我有一个应用程序 A 它有一个composer json 文件 定义了对包 P 的依赖关系 这是我自己的新闪亮包 我的包 P 有一个composer json 文件 它定义了对库 L 和框架 F 的依赖关系 我的包 P 还没有远程存储库 并
  • 如何在 Kubernetes 中模仿“--volumes-from”

    我正在寻找一种模式 允许在 Kubernetes 中同一 Pod 上运行的两个容器之间共享卷 我的用例是 我有一个 Ruby on Rails 应用程序在 Docker 容器内运行 docker 镜像包含静态资源 app
  • 如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作?

    我在用原始打印机助手 http support microsoft com kb 322091 en us用于打印 它可以在 Windows 7 及之前的版本上正常运行 当我们使用安装在 Windows 8 电脑上的打印机进行尝试时 它不起