1

通过使用 Windows 驱动程序开发工具包示例包 (v 8.1),我找到了一个示例打印处理器实现,我尝试将其用作我自己的自定义打印处理器(“GenPrint 打印处理器示例”)的起点。我设法在 Visual Studio 2017 社区中成功构建它(将 PlatformToolset 更改为“v141”),并且我显然能够成功安装它(通过创建注册表项“HKLM:\SYSTEM\CurrentControlSet\Control\Print\Environments \Windows x64\Print Processors\genprint”,项目属性为“Driver”,值为“genprint.dll”,并将新构建的 dll 复制到 %WinDir%/System32/spool/prtprocs/x64/)。然后我可以设置一个测试打印机并使用打印机属性>高级>打印处理器选择我的“genprint”打印处理器...,我什至可以从 Visual Studio 中的调试器附加到假脱机进程 spoolsv,并在 EnumPrintProcessorDatatypesW(...) 中设置断点,当我为我的测试打印机重新打开“打印处理器”对话框时,它会被击中。到目前为止,一切都很好!

当我在其他任何地方设置断点并将实际作业排队到打印机队列时,问题就来了。在 OpenPrintProcessor(...) 的开头说。或者 PrintDocumentOnPrintProcessor(...),或者,你命名它。没什么,nada,zilch。似乎这些函数根本就没有被调用过,至少我的 DLL 导出的实现没有。我什至求助于在 DLL 导出的每个函数的开头插入事件日志 ala Event Tracing for Windows (ETW),但唯一生成的日志是 EnumPrintProcessorDatatypesW(...) 的日志。

地球上可能会发生什么?是否有可能,出于某种奇怪的原因,假脱机程序使用的打印处理器与我的不同,即使我明确地将我的打印队列与相关的打印队列相关联?如果是这样,为什么?

[更新:看起来我看到的行为归结为“打印驱动程序隔离”;当我将与队列关联的驱动程序的隔离模式更改为“无”时,我可以附加到 spoolsv 进程。否则,我的打印处理器将在一个单独的进程中运行,通过 DCOM 与 spoolsv 通信,如下所述:https ://blogs.technet.microsoft.com/askperf/2009/10/08/windows-7-windows-server-2008 -r2-print-driver-isolation/ ——我猜自 Windows 7 以来,系统范围的默认设置已更改为使用打印驱动程序隔离,除非您将驱动程序显式配置为“无”(或者它自行配置为方法)]

4

0 回答 0