如果我想寻求帮助,我遇到了问题:
我的任务是使用带有“打印”动词的 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 中获得任何附加数据。不过,这适用于启动事件,我使用我的日志和调试器进行了验证。但是对于 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, threadArgs->wfsoTimeout)) == WAIT_OBJECT_0)
{
LOG4CXX_DEBUG(logger, L"Irgendein Druckereignis im Thread zum Warten auf Ereignis " << LogStringConv(threadArgs->event) << L" erkannt.");
[...]
PPRINTER_NOTIFY_INFO notifyInfo = NULL;
DWORD events = 0;
FindNextPrinterChangeNotification(changeNotification, &events, NULL, (LPVOID*) ¬ifyInfo);
if (!(events & threadArgs->event) || !notifyInfo || !notifyInfo->Count)
{
LOG4CXX_DEBUG(logger, L"unpassendes Ereignis " << LogStringConv(events) << L" ignoriert");
FreePrinterNotifyInfo(notifyInfo);
continue;
}
[...]
如果有人能就我为什么没有得到任何有关打印作业的数据提供一些提示,我将不胜感激。谢谢!
https://forums.embarcadero.com/thread.jspa?threadID=86657&stqc=true