打印到PDF会导致我的主应用程序挂起在WaitForSingleObject调用中

时间:2016-08-11 10:02:41

标签: c++ printing mfc waitforsingleobject

我们有这个使用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

0 个答案:

没有答案