我有一个进程,我从CreateProcess开始,然后我等待它完成并检查其退出代码.我在批处理模式下执行此操作,如果进程崩溃,我不希望显示任何消息框.仅返回非零退出代码即表示失败就足够了.到目前为止,我已经尝试过使用
LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS *lpTopLevelExceptionFilter) { ExitProcess(-1); return EXCEPTION_EXECUTE_HANDLER; } BOOL CMyApp::InitInstance() { AfxEnableControlContainer(); SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); throw std::runtime_error("test"); }
但这并不总是保持沉默.有时会显示一个对话框:
--------------------------- Microsoft Visual C++ Runtime Library --------------------------- Runtime Error! Program: C:\Workspace\MyApp\Release\MyApp.exe abnormal program termination --------------------------- OK ---------------------------
解决方法
你想抑制两件事:
第一次使用SetErrorMode
请求SEM_FAILCRITICALERRORS和SEM_NOGPFAULTERRORBox.通过使用_set_abort_behavior
改变CRT行为可以抑制第二个.
你实际上并不需要一个带有SetUnhandledExceptionFilter的空处理程序 – 你没有做任何重要的事情.证明没有处理程序会使进程崩溃,SetErrorMode(见上文)将禁止不需要的操作系统通知.
示例代码:
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBox); _set_abort_behavior(0,_WRITE_ABORT_MSG);