阻止win32进程崩溃时的模态对话框

时间:2009-12-07 17:27:52

标签: c++ winapi

我们有一个遗留构建基础架构,用于夜间构建(在Perl中实现),用于编译,链接和单元测试我们的应用程序/插件。在Windows上,如果单元测试过程崩溃,则会弹出一个“锁定”构建场的模态对话框。

是否有办法(win32 API调用,系统配置,env var,某些东西......)禁用此行为以使子进程在崩溃时立即终止,而不使用模态对话框和非零退出状态?

谢谢, - DD

PS:我们在Windows上使用SEC(结构化异常处理)进行编译,以便能够使用catch(...)“捕获”崩溃,因此在大多数情况下避免此问题,但有时这还不够,因为当然,一些崩溃是不可恢复的(例如,如果它们损坏了堆栈)。

5 个答案:

答案 0 :(得分:6)

根据谁抛出对话框,您可能需要结合多种方法。

    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);

...将关闭一组对话框。

答案 1 :(得分:3)

您需要添加一个捕获所有异常的“未处理的异常处理程序”:在初始化代码中调用SetUnhandledExceptionFilter(handler),它将调用处理程序例程。真的很简单。

我使用旧文章中的示例代码,包含一个名为minidumper的文件,调用公开的函数,然后就完成了。

Here's some more example code,会弹出一个不同的对话框,但您可以将其更改为只是将消息写入日志文件或类似文件。

如果您正在编写纯.NET应用程序,那么您将对this article更感兴趣。

答案 2 :(得分:0)

  1. 不要使用“catch(...)”语句,因为那时你可能会忽略单元测试的重点。
  2. 你需要的是一个非模态对话框,因为模态对话框用于阻止用户进行任何进一步的操作,程序执行(在你的情况下运行单元测试)会挂断,直到用户做出他/她的选择。现在无法避免崩溃对话框,但您需要了解单元测试框架如何处理这些情况。我会说你错过了单元测试框架的一些东西,因为如果我的应用程序崩溃了,我只能从Boost.Test存根中获得一条关于它的日志消息。
  3. 如果您将单元测试作为子进程运行,它不应该阻止您的构建机器人,但是:如果单元测试用例失败,您不应该继续构建过程。

答案 3 :(得分:0)

您可以使用WSH“编写”Windows脚本。

有了它,你可以“模拟”有人点击了模态窗口的“接受”按钮,或者发送ESC键来关闭它。

问候。

答案 4 :(得分:0)

我仍然使用名为RTVReco的旧程序。它只是一个推动应用程序的按钮,非常容易使用。它暂时没有更新,但它仍然是我见过的最容易的。