У нас есть это приложение, которое использует mshtml.dll & rundll.32.exe для печати определенных данных. В Windows 10, если я выбираю «Microsoft Print to PDF» или «Microsoft XPS Document Writer» в качестве принтера, мое приложение зависает. Когда я заканчиваю задачу через диспетчер задач, только тогда открывается диалоговое окно «Сохранить вывод на печать как». В реальном принтере проблем нет.
Вот фрагмент кода для этого.
parameter.Format(_T("%s\\mshtml.dll,PrintHTML \"%s\""), systemPath, strHtmlFileName);
SHELLEXECUTEINFO shPrintInfo = {0};
shPrintInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shPrintInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shPrintInfo.hwnd = hWnd;
shPrintInfo.lpVerb = NULL;
shPrintInfo.lpFile = _T("rundll32.exe");
shPrintInfo.lpParameters = parameter;
shPrintInfo.lpDirectory = NULL;
shPrintInfo.nShow = SW_NORMAL;
shPrintInfo.hInstApp = NULL;
ShellExecuteEx(&shPrintInfo);
if (shPrintInfo.hProcess != NULL)
{
::WaitForSingleObject(shPrintInfo.hProcess, INFINITE);
::CloseHandle(shPrintInfo.hProcess);
}
Я выделил код, в котором висит приложение, и он находится в вызове WaitForSingleObject (). Он никогда не заканчивается и блокирует появление диалогового окна «Сохранить вывод на печать как». Если я изменю INFINITE, скажем, на 10000 (10 секунд), появится диалоговое окно «Сохранить вывод на печать как», но если я протестирую распечатку на реальном принтере и пережду 10 секунд, данные не будут напечатаны, так как дескриптор или процесс были закрыты с помощью вызова CloseHandle ().
Надеюсь, вы могли бы помочь мне.
Глядя на MsgWaitForMultipleObjectsEx в соответствии с предложением Джонатана Поттера, я нашел решение, следуя этой теме
Понимание MsgWaitForMultipleObjects
Задача ещё не решена.
Других решений пока нет …