当一个进程崩溃时,我怎么能压制所有的错误对话框(我只想让它安静地崩溃)

How can I supress all error dialogs when a process crashes (I only want it to crash silently)

本文关键字:崩溃 对话框 错误 只想 安静 怎么能 一个 进程 压制      更新时间:2023-10-16

我有一个进程,我用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:WorkspaceMyAppReleaseMyApp.exe

abnormal program termination

---------------------------
OK   
---------------------------

您想要抑制两件事:

  1. 操作系统模式对话框在崩溃时通知用户
  2. 您自己的对话框在运行时弹出

第一个是SetErrorMode请求SEM_FAILCRITICALERRORSSEM_NOGPFAULTERRORBOX。第二种可以通过用_set_abort_behavior改变CRT行为来抑制。

实际上,您并不需要一个带有SetUnhandledExceptionFilter的空处理程序——您在那里没有做任何重要的事情。证明没有处理程序会使进程崩溃,SetErrorMode(见上文)将抑制不需要的操作系统通知。

示例代码:

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_set_abort_behavior(0,_WRITE_ABORT_MSG);

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

  1. 未捕获的C++异常
  2. C++库正在退出
  3. Win32未捕获的异常

在Windows上,C++异常通常会重用Win32异常处理的一部分。因此,您的方法寻址1和3,但未命中2。这就是消息来自"Microsoft Visual C++运行库"的原因。你需要_set_abort_behavior(0, _WRITE_ABORT_MSG)来抑制它。