Я застрял в проблеме, где я хотел бы попросить помощи:
У меня есть задача распечатать некоторые файлы разных типов, используя 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