Tag: printing

FindNextPrinterChangeNotification为ppPrinterNotifyInfo返回NULL

如果我想请求帮助,我会遇到问题: 我的任务是使用带有“print”动词的ShellExecuteEx打印一些不同类型的文件,并且需要保证所有文件的打印顺序。 因此,我使用FindFirstPrinterChangeNotification和FindNextPrinterChangeNotification来监视事件PRINTER_CHANGE_ADD_JOB和PRINTER_CHANGE_DELETE_JOB,后台我在调用ShellExecuteEx之前启动了两个不同的线程,因为我对打印文件的应用程序一无所知等等。我唯一知道的是我是唯一一个打印和我打印的文件。 我的解决方案似乎运行良好,我的程序成功识别我的文件的事件PRINTER_CHANGE_ADD_JOB,我甚至通过指定JOB_NOTIFY_FIELD_DOCUMENT来检查通过检查作为附加信息给我的内容来为我的文件发出此事件。 问题现在是事件PRINTER_CHANGE_DELETE_JOB,我没有得到关于打印作业的任何附加信息,虽然我的逻辑对于两个事件完全相同:我编写了一个通用线程函数,它只是用事件执行它是用来。 我的线程正在识别PRINTER_CHANGE_DELETE_JOB事件,但每当发生此事件时,每次调用FindNextPrinterChangeNotification时都不会在ppPrinterNotifyInfo中获得任何添加数据。 这适用于启动事件,但我使用我的日志和调试器进行了validation。 但是使用PRINTER_CHANGE_DELETE_JOB我唯一得到的就是NULL。 我已经在网上搜索了一些类似的问题,但大部分时间都与VB有关或者根本没有答案。 我正在使用一个C ++项目,因为我的代码适用于ADD_JOB事件我不认为我做错了什么。 但即使是MSDN也没有提到这种行为,我真的想确保DELETE_JOB事件是我文档的事件,我不能没有关于打印作业的任何信息。 在我收到DELETE_JOB事件后,我的代码甚至无法识别其他事件,这是正常的,因为之后完成了打印作业。 以下是我认为的相关通知代码: WORD jobNotifyFields[1] = {JOB_NOTIFY_FIELD_DOCUMENT}; PRINTER_NOTIFY_OPTIONS_TYPE pnot[1] = {JOB_NOTIFY_TYPE, 0, 0, 0, 1, jobNotifyFields}; PRINTER_NOTIFY_OPTIONS pno = {2, 0, 1, pnot}; HANDLE defaultPrinter = PrintWaiter::openDefaultPrinter(); HANDLE changeNotification = FindFirstPrinterChangeNotification( defaultPrinter, threadArgs->event, 0, &pno); […] DWORD waitResult = WAIT_FAILED; while ((waitResult = WaitForSingleObject(changeNotification, […]