518抽奖软件源码之:使得除零异常可被捕获(VC++)
518抽奖软件源码之:使得除零异常可被捕获(VC++)在开发“518抽奖软件”的时候,需要捕获硬件异常,例如除零等。 但是发现__try/__except没有捕获各异常,问题出在那里呢?经研究找到了解决方法,开发工具是VC2015,源码如下。
1. _controlfp 启用除零异常
程序代码:
int cw = _controlfp(0, 0); //原始控制字 cw &= ~(EM_ZERODIVIDE); // cw &= ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_DENORMAL); _controlfp(cw, MCW_EM); // ~:取反 _controlfp 停用异常(1:停用;0:启用)
2. 在“项目-属性-C++代码生成”里设置
启用C++异常项: 选 /EHa
安全检查项:选 禁用安全检查(这个是关键,网上搜的资料都没说这个,害我耗费很多功夫)
3. 结构化异常处理代码
程序代码:
__try { if (!g_app.init_app(g_app.m_hInst)) return; MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (g_app.m_bPb) { if (!TranslateAccelerator(g_app.m_hMain, hAccelPb, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else if (g_app.m_bSc) { if (!TranslateAccelerator(g_app.m_hMain, hAccelSc, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else { if (!TranslateAccelerator(g_app.m_hMain, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } __except(1) { // 弹出异常消息或处理 }
[此贴子已经被作者于2017-10-21 14:56编辑过]