windows 崩溃不提示
转载请注明来源:https://www.cnblogs.com/hookjc/
碰到某些程序崩溃时弹出带红色叉叉的错误窗口或者是叫你选择调试或关闭的窗口,很碍眼。不过平时也没去理它,点掉就好。


今天客户反映我们的程序崩溃后就起不来了,其实我们为了方便无人化管理,做了一个守护进程。如果程序异常退出就会重启那个程序,这在linux下没问题,程序崩溃了就直接退出返回非零值,但是window就bug了,搞不好就给你弹出个错误对话框,你不点掉其实程序就没退出,守护进程就不知道这个程序是否崩溃,于是这个程序就永远死在那个窗口上了。现在这不仅碍眼,还碍事!于是着手摆平之。
先是晚上搜到可以修改注册表来组织程序或系统的弹出对话框,参考:http://technet.microsoft.com/en-us/library/cc976167.aspx。不过这不可行,我们只是希望我们的程序不会弹出对话框,尽量少改系统的。而且试了下发现还是会弹出来,就是那个werfault.exe进程,xp下可能不会。算了,这条路不走了。
    用代码肯定也有办法解决。你看人家qq什么的奔溃了有弹出的都是自家的温馨提示,我们不需要温馨提示,只要返回非零值就好。
    万能的Google一下子就搜出结果来了。原来Microsoft对c和c++进行了扩展,支持异常处理,而且貌似标准c++里的异常处理也是它的一个封装。Microsoft的异常处理函数是__try,__except。
先试了这么个简单的例子
- #include <windows.h>
- #include <excpt.h>
- #include <stdio.h>
- #define CRASH_SILENTLY 1
- #if defined(_MSC_VER) && CRASH_SILENTLY
- #include <excpt.h>
- #define Q_TRY_BEGIN __try {
- #define Q_TRY_END }
- //EXCEPTION_EXECUTE_HANDLER
- #define Q_EXCEPT __except(EXCEPTION_EXECUTE_HANDLER) { \
- printf("Shit happens!\n");fflush(NULL); \
- return 1;}
- #else
- #define Q_TRY_BEGIN
- #define Q_TRY_END
- #define Q_EXCEPT
- #endif
- int main(int, char**)
- {
- Q_TRY_BEGIN
- int *a = 0;
- *a = 0;
- Q_TRY_END
- Q_EXCEPT
- printf("Exiting 0...\n");
- fflush(NULL);
- return 0;
- }
如果把CRASH_SILENTLY定义为0,那么在程序崩溃就会弹出对话框,设为一就只打印Shit happens!然后就返回。
    __except的参数有三种,详细内容见http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx,我就不抄了。
    其实为什么系统会弹出这么一个对话框呢?其实在vc运行库中顶层函数也用了__try, __except的异常捕获机制。不知您看了__except的参数了没,我的示例程序里是EXCEPTION_EXECUTE_HANDLER,表示异常被识别,就在__except后面的代码段进行异常处理。如果是EXCEPTION_CONTINUE_SEARCH,那么异常会继续被派发到外层,这最外层就是vc库,vc库它的处理手段就是碍眼又碍事的对话框!
    上面这个程序只是演示用的,很简单。然后我就满怀希望地对公司的程序也做了类似的处理,然后悲剧发生了,竟然编译都通不过!编译错误是C2712:cannot use __try in functions that require object unwinding。于是又google了一番。msdn真的很棒,资料丰富,这下有时msdn上的方法解决的。详见http://msdn.microsoft.com/en-us/library/xwtb73ad%28VS.80%29.aspx
    With /EHsc, a function with structured exception handling cannot have objects that require unwinding (destruction).
    我们的程序里出现了有析构函数的对象,同时编译参数又有/EHsc,于是出现编译错误了。
来源:python脚本自动迁移
windows 崩溃不提示的更多相关文章
- Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required
		Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required,Get it from http://aka.ms/vcpyth ... 
- 排错-Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法
		Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法 by:授客 QQ:1033553122 1.启动windows相关服务 win->services. ... 
- Windows打开应用,提示“此程序被组策略阻止”
		Windows打开应用,提示"此程序被组策略阻止",该问题为组策略限制了用户使用某个应用程序,一般可以在 1 控制面板--->管理工具--->本地安全策略-->软 ... 
- windows cmd窗口提示“telnet”命令不能内部或外部命令,也不是可运行的程序
		windows cmd窗口提示“telnet”命令不能内部或外部命令,也不是可运行的程序 原因:C:\Windows\System32目录下没有telnet.exe,path系统变量的值包含了C:\W ... 
- 如何打开 Windows 的热键提示
		如何打开 Windows 的热键提示 很早之前我记的 Windows 是有热键提示的,不知道什么时候开始默认不显示了,难道 微软是为是美观? 找了一下原来是有地方可以设置的. 
- Windows 7 频繁提示:计算机的内存不足
		最近由于同时打开的程序比较多,Windows 7 频繁提示:计算机的内存不足,如下图: 问题原因: 经过一番尝试,得出一个大概的结论:当虚拟内存空间的大小小于物理内存空间的大小时,一旦程序开的太多,物 ... 
- 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数
		1 案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ... 
- 批处理安装Windows服务,提示"InstallUtil.exe"不是内部命令也不是外部命令解决方式
		今天在测试一个C#写的windows服务的时候,在用bat进行调用cmd安装的时候, cd C:\Windows\Microsoft.NET\Framework\v2.0.50727 InstallU ... 
- 安装Cnario提示.Net 3.5安装错误, 检查Windows系统更新提示无法检查到更新, 安装.Net 3.5提示"Windows无法完成请求的更改, 错误代码:0x800F081F"
		症状: Windows检查系统更新时提示无法完成, 尝试安装.Net 3.5等组件时都无法完成, 错误代码: 0x800F081F 原因: 可能时设置了禁止Windows自动更新, 需要重新打开 解决 ... 
随机推荐
- Java的发展简史
			Java是由Sun Microsystems公司(简称Sun公司)于1995 年 5 月推出的 Java程序设计语言和Java平台的总称.Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语 ... 
- Android物联网应用程序开发(智慧城市)—— 购物信息的存储界面开发
			效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ... 
- PHP DateTime类常用方法总结
			实例化: $date = new DateTime(); $date = new DateTime('2018-01-01'); $date = new DateTime('tomorrow'); $ ... 
- Microsoft HoloLens 开发(3): 全息图交互方式 - Gaze
			Gaze(凝视) 是 HoloLens 交互输入的第一种形式,告诉你 用户 在世界上的位置,并让你确定他们的意图. 1.Gaze的用途 作为一个 Mixed Reality 开发者,Gaze 可以做很 ... 
- 在quasar 注册全局filter
			A common use case for Quasar applications is to run code before the root Vue app instance is instant ... 
- mysql  的 if  和 SQL server 的 iif
			在sql语句中,mysql 使用 if 而SQL server 使用iif 如 mysql : SELECT IF(1<2,'yes ','no'); sql server: SELECT II ... 
- Python常用功能函数系列总结(二)
			本节目录 常用函数一:sel文件转换 常用函数二:refwork文件转换 常用函数三:xml文档解析 常用函数四:文本分词 常用函数一:sel文件转换 sel是种特殊的文件格式,具体应用场景的话可以 ... 
- Spark案例练习-PV的统计
			关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 云盘目录说明: tools目录是安装包res 目录是每一个课件对应的代码和资源等doc ... 
- Linux驱动实践:中断处理函数如何【发送信号】给应用层?
			作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ... 
- linux 安装 elasticsearch 步骤及问题解决方案
			1.下载安装包并上传至服务器 2.解压至当前文件夹 tar -xzvf xxx.tar.gz 3.配置JDK 如果服务器上已经配置了JDK,则在解压后的elasticsearch 文件夹的bin 目录 ... 
