我们有这个使用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,我通过以下线程找到了解决方案 Understanding MsgWaitForMultipleObjects