我有一个应用程序需要使用相关的应用程序打印不同类型的文件,以便使用ShellExecute和“print”动词进行打印。我的应用程序需要(希望)可靠地知道何时完成一个打印作业的处理并且可以发出下一个打印作业。我使用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开发机器中并将其与我的打印一起使用应用程序,FindNextPrinterChangeNotification始终成功返回,但同样总是设置PRINTER_NOTIFY_INFO_DISCARDED标志。
我的客户之后通过打印机的嵌入式打印服务器直接将打印机安装到客户端,并告诉我我的打印应用程序现在与本地打印机一样工作。意味着PRINTER_NOTIFY_INFO_DISCARDED标志设置为我的应用程序版本中没有更多事件,这是一个错误状态,将退出应用程序。
我尝试再次使用cups-pdf重现,这次我没有安装Samba导出的打印机,而是直接使用URL http://domain.example.org:631/printers/PDF指定杯子的打印机名称。我可以在Windows中成功使用此打印机,但我的应用程序再次获得奇怪的事件。这次我没有得到PRINTER_NOTIFY_INFO_DISCARDED标志设置的结果,但是ppPrinterNotifyInfo总是NULL,我根本没有得到任何结果,但是FindNextPrinterChangeNotification成功返回。
Microsoft提供了有关防火墙和打印机通知可能被客户端阻止的说明,但我不认为这是我的问题,因为我已经使用已禁用的防火墙测试了相同的方案,启用了防火墙,结果不同取决于我的开发机器如何与打印机对话,我的Windows 7防火墙设置似乎默认允许打印机通信。
总而言之:我没有找到任何有关不同网络打印机的可靠打印机通知的信息。一切都取决于打印机驱动程序?似乎不是这样,因为如果Samba导出打印机或者直接使用http,它会有所不同。从我读到的内容看,Windows 7使用客户端渲染打印作业,然后将作业发送到网络假脱机程序,我可以在本地假脱机程序中看到这些作业很长一段时间。为什么我也不收到通知?是否使用Windows Server按照设计共享Samba和打印机不应发布打印机通知?我找不到任何信息说。
我非常感谢任何有助于提供相关信息的文档的帮助或提示。谢谢!