当一个进程崩溃时,我怎么能压制所有的错误对话框(我只想让它安静地崩溃)
How can I supress all error dialogs when a process crashes (I only want it to crash silently)
我有一个进程,我用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
---------------------------
您想要抑制两件事:
- 操作系统模式对话框在崩溃时通知用户
- 您自己的对话框在运行时弹出
第一个是SetErrorMode
请求SEM_FAILCRITICALERRORS
和SEM_NOGPFAULTERRORBOX
。第二种可以通过用_set_abort_behavior
改变CRT行为来抑制。
实际上,您并不需要一个带有SetUnhandledExceptionFilter
的空处理程序——您在那里没有做任何重要的事情。证明没有处理程序会使进程崩溃,SetErrorMode
(见上文)将抑制不需要的操作系统通知。
示例代码:
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_set_abort_behavior(0,_WRITE_ABORT_MSG);
您正在处理三种异常终止:
- 未捕获的C++异常
- C++库正在退出
- Win32未捕获的异常
在Windows上,C++异常通常会重用Win32异常处理的一部分。因此,您的方法寻址1和3,但未命中2。这就是消息来自"Microsoft Visual C++运行库"的原因。你需要_set_abort_behavior(0, _WRITE_ABORT_MSG)
来抑制它。
相关文章:
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何检测窗口当前是否正在运行模式对话框?
- 用静态版本的QT编译时,文件对话框崩溃
- 在我关闭刚开始的孩子对话框并进入父母对话框之后,我的QT桌面应用程序不断崩溃
- 儿童对话框 - setWindowTexta或sendmessagea崩溃程序-MFC
- MFC对话框成员变量的随机崩溃不在范围中
- MFC 结束对话框崩溃时模式对话框没有焦点
- Windows Server 2008 R2上的常见对话框:GetOpenFileName崩溃
- 混合 mfc 对话框和 mdi 项目的调试版本中崩溃
- 当一个进程崩溃时,我怎么能压制所有的错误对话框(我只想让它安静地崩溃)
- 在子进程中禁用崩溃对话框
- 当我的程序崩溃时,应用程序启动时自动丢弃windows msg错误对话框(Win7-32, c++, VSE2013)