当进程崩溃时我怎么能压制所有错误对话框(我只希望它以静默方式崩溃)

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

你想抑制两件事:

  1. OS模式对话框通知用户崩溃
  2. 您自己的对话框由运行时弹出

你首先SetErrorMode要求SEM_FAILCRITICALERRORSSEM_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)


MSa*_*ers 5

你正在处理三种异常终止:

  1. 未捕获的C++异常
  2. C++库退出
  3. Win32未被捕获的例外.

在Windows上,C++异常通常重用Win32异常处理的部分内容.因此,您的方法解决了1和3,但未命中2.这就是消息来自"Microsoft Visual C++运行时库"的原因.你需要_set_abort_behavior(0, _WRITE_ABORT_MSG)压制它.