sas*_*alm 8 c++ winapi exception-handling
我有一个进程,我从CreateProcess开始,然后我等待它完成并检查其退出代码.我在批处理模式下执行此操作,如果进程崩溃,我不希望显示任何消息框.仅返回非零退出代码即表示失败就足够了.到目前为止我已经尝试过使用了
LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS *lpTopLevelExceptionFilter)
{
ExitProcess(-1);
return EXCEPTION_EXECUTE_HANDLER;
}
BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
throw std::runtime_error("test");
}
Run Code Online (Sandbox Code Playgroud)
但这并不总是保持沉默.有时会显示一个对话框:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!
Program: C:\Workspace\MyApp\Release\MyApp.exe
abnormal program termination
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
Rom*_* R. 11
你想抑制两件事:
你首先SetErrorMode要求SEM_FAILCRITICALERRORS和SEM_NOGPFAULTERRORBOX.第二个可以通过改变CRT行为来抑制_set_abort_behavior.
你实际上并不需要一个空的处理程序SetUnhandledExceptionFilter- 你没有做任何重要的事情.证明没有处理程序会使进程崩溃,并且SetErrorMode(见上文)将禁止不需要的操作系统通知.
示例代码:
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_set_abort_behavior(0,_WRITE_ABORT_MSG);
Run Code Online (Sandbox Code Playgroud)
你正在处理三种异常终止:
在Windows上,C++异常通常重用Win32异常处理的部分内容.因此,您的方法解决了1和3,但未命中2.这就是消息来自"Microsoft Visual C++运行时库"的原因.你需要_set_abort_behavior(0, _WRITE_ABORT_MSG)压制它.
| 归档时间: |
|
| 查看次数: |
7064 次 |
| 最近记录: |