| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 423 人关注过本帖
标题:518抽奖软件源码之:使得除零异常可被捕获(VC++)
只看楼主 收藏
wsg1212
Rank: 1
来 自:518抽奖软件
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-5-6
  问题点数:0  回复次数:0   
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编辑过]

2017-10-21 14:53







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.085781 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved