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() 呼び出しによって。
あなたが私を助けてくれることを願っています。
Jonathan Potter によって提案された MsgWaitForMultipleObjectsEx を見て、このスレッドを 理解することで解決策を見つけました MsgWaitForMultipleObjectsを理解する