Windows|小技巧:禁用程序崩溃对话框
如果你不希望在程序崩溃的时候显示系统默认的错误对话框 , 有一个方法可以做到 。
即:设置进程的错误模式为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》
【Windows|小技巧:禁用程序崩溃对话框】
- 小米科技|不聊性能只谈拍照!新旗舰反向升级成潮流,拍照手机如何选?
- ftp|闲鱼快速提高曝光浏览量技巧,闲鱼快速卖货技巧
- 华为|别不信!魅族如今处境,雷军早有预料,小米也早已体验
- 小米科技|预算只有两三千买这三款,颜值性能卓越,没有超高预算的用户看看
- 小米科技|RTX3060的性能到底如何?相比RTX2060提升有多大?
- 小米 11 Ultra 内测 NFC“读写勿扰”与“解锁后使用”功能
- 百度|马化腾的一句话,腾讯市值一小时暴涨1400亿港币,马云格局还是小了
- 拼多多|砍价永远差一刀?拼多多回应:小数点后有6位
- 飞利浦·斯塔克|最便宜的小米 12 来了,2000 块左右
- CPU|E5系列处理器——工作室和生产力专业处理器,小白请勿购买