我有一个应用程序需要使用它们关联的应用程序打印不同类型的文件,以便使用 ShellExecute 和“打印”动词进行打印。我的应用程序需要(希望)可靠地知道一个打印作业何时完成并且可以发出下一个打印作业。我使用 FindNextPrinterChangeNotification 完成此操作,并且使用本地打印机(例如通过 USB 安装)似乎一切正常,但如果涉及网络打印机,我会得到完全不同的行为。
我的一个客户将我的应用程序与网络打印机一起使用,这意味着专业打印机嵌入了自己的打印服务器,安装在 Windows Server 2008 R2 上,并使用 Windows 将安装的打印机共享给它的客户端。在这种情况下 FindNextPrinterChangeNotification 总是返回成功,但它返回的结构也总是设置了标志 PRINTER_NOTIFY_INFO_DISCARDED。我可以自己使用 Windows Server 2008 R2 重现此行为,它不会使用自己的嵌入式打印机服务器导出打印机,而只是本地安装的 FreePDF XP。此外,如果我在我们的一台 Ubuntu 开发服务器上使用 samba、cups 和 cups-pdf,我会得到相同的行为:Samba 成功导出了 cups-pdf 打印机,并且如果我将它安装在我的 Windows 7 开发机器中并将它与我的打印一起使用应用,
我的客户后来通过打印机的嵌入式打印服务器直接将他的打印机安装到它的客户端,并告诉我我的打印应用程序现在可以像使用本地打印机一样工作。意味着不再有 PRINTER_NOTIFY_INFO_DISCARDED 标志设置为我的应用程序版本的事件,这是一个错误状态,将退出应用程序。
我尝试再次使用 cups-pdf 重现,这次我没有安装 Samba 导出的打印机,而是直接通过使用 URL http://domain.example.org:631/printers/指定 cups 的打印机名称.pdf _ 我可以在 Windows 中成功使用这台打印机,但我的应用程序再次出现奇怪的事件。这次我没有得到设置了标志 PRINTER_NOTIFY_INFO_DISCARDED 的结果,但是 ppPrinterNotifyInfo 始终为 NULL,我根本没有得到任何结果,但是 FindNextPrinterChangeNotification 成功返回。
Microsoft 提供了有关防火墙的说明,打印机通知可能会被客户端阻止,但我认为这不是我的问题,因为我已经使用禁用的防火墙测试了相同的场景,启用的防火墙结果会有所不同,具体取决于如何我的开发机器正在与打印机通话,而我的 Windows 7 防火墙设置似乎默认允许打印机通信。
长话短说:我没有发现任何关于不同网络打印机的打印机通知有多可靠的信息。一切都取决于打印机驱动程序吗?似乎并非如此,因为如果 Samba 导出打印机或直接使用 http,它会有所不同。根据我的阅读,Windows 7 使用客户端渲染打印作业,然后将作业发送到网络假脱机程序,我可以在本地假脱机程序中看到这些作业很长时间。为什么我也没有收到通知?Samba 和打印机是否按设计使用 Windows Server 共享,不应该发布打印机通知?我找不到任何这样说的信息。
我真的很感激任何可以提供一些启示的文档的帮助或提示。谢谢!