【问题标题】:How can I supress all error dialogs when a process crashes (I only want it to crash silently)进程崩溃时如何抑制所有错误对话框(我只希望它静默崩溃)
【发布时间】:2012-03-31 21:35:52
【问题描述】:

我有一个从 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   
---------------------------

【问题讨论】:

标签: c++ winapi exception-handling


【解决方案1】:

你想抑制两件事:

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

您首先使用SetErrorMode 请求SEM_FAILCRITICALERRORSSEM_NOGPFAULTERRORBOX。第二个可以通过使用_set_abort_behavior 更改 CRT 行为来抑制。

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

示例代码:

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

【讨论】:

    【解决方案2】:

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

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

    在 Windows 上,C++ 异常通常重用部分 Win32 异常处理。因此,您的方法解决了 1 和 3,但错过了 2。这就是消息来自“Microsoft Visual C++ 运行时库”的原因。你需要_set_abort_behavior(0, _WRITE_ABORT_MSG) 来抑制它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多