小技巧:禁用程序崩溃对话框

小技巧:禁用程序崩溃对话框

作者:BlogUpdater |  时间:2021-08-23 |  浏览:920 |  评论已关闭 条评论

如果你不希望在程序崩溃的时候显示系统默认的错误对话框,有一个方法可以做到。
即:设置进程的错误模式为SEM_NOGPFAULTERRORBOX,最简单的方式是,使用如下的API调用:
SetErrorMode(SEM_NOGPFAULTERRORBOX);

但是请注意,这个调用会直接覆盖之前的进程错误模式,换句话说,就是你会无意中关掉进程其他的错误模式。

另外,系统中并不存在一个GetErrorMode函数,所以,你需要以如下的方式来调用两次SetErrorMode,从而避免上面所说的问题。
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);

在上面的代码中,我们先设置新的错误模式(这可能会禁用之前设置的其他的错误模式),然后我们保存了其返回值。然后我们继续进行设置,通过在现有的错误模式上添加了一个新的SEM_NOGPFAULTERRORBOX标志来实现。

使用上面的方式来设置错误模式很重要。举个例子,如果旧的错误模式包含了SEM_NOALIGNMENTFAULTEXCEPT标志。如果它被意外的关闭了,则应用程序不会再接收自动化对齐修复,从而导致应用程序崩溃。

(但是如果你进一步的阅读文档,你会发现,SEM_NOALIGNMENTFAULTEXCEPT这个标志非常特别:操作系统不会允许你关闭这个错误模式,为什么?因为实在有太多人犯了上述的错误。我还记得,在这个特别的标志被引入之前,应用程序总是时常会崩溃,因为他们没有使用正确的方式来设置进程错误模式。因为这个原因,微软决定将这个特殊规则添加到系统中。欢迎来到兼容性的世界,为了兼容一些程序员的代码错误,操作系统不得不做一些兼容性的设计。所以,我想在此特别提醒,SetErrorMode这个函数,非常容易导致误用,你得十分小心了)

另外,错误模式在整个进程中有效,而不是仅仅针对线程。这意味着,你需要在操作进程错误模式的时候十分小心,因为很有可能会影响到进程中的其他线程(更加可能的是,这些线程可能是你无法控制的系统级线程)。所以为了安全起见,一个应用程序仅应该在进程启动的时候设置错误模式,并不要和其他错误模式弄混了。

当然了,如果你使用上面的方法禁用了应用程序标准崩溃对话框,则你可能无法使用Windows Error Reporting组件提供的崩溃错误收集功能,这样你就很难定位到程序崩溃的具体位置。

总结
应用程序本不应该崩溃,但天下没有完美的程序,我们能做的,就是让程序崩溃的时候距离错误代码尽可能的近,这样才有机会修复它。
问题一个接一个地被修复了,崩溃的几率就小了。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Disabling the program crash dialog》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。