Я застрял на проблемы были, я хотел бы попросить о помощи:FindNextPrinterChangeNotification возвращает NULL для ppPrinterNotifyInfo
У меня есть задание, чтобы напечатать несколько файлов разных типов с использованием 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
Любая причина, по которой это объяснение было проголосовано? Даже MSDN говорит что-то о сворачивающихся событиях, нескольких событиях событий в одном уведомлении и т. Д. –