zoukankan      html  css  js  c++  java
  • 如何消除Microsoft Office Spreadsheet 11.0控件引起的断言失败对话框

    转载自:程序人生

    在一个对话框上,插入一个Microsoft Office Spreadsheet 11.0控件(Office 2003带的),再插入一个别的具有焦点的控件,比如Edit控件,运行之后,用鼠标在Microsoft Office Spreadsheet 11.0控件和Edit控件之间切换一下焦点(如果用Tab切换没问题),再关闭对话框,就出现断言失败(这时所有代码都是开发环境产生的), 调试器定位在cmdtarg.cpp中:

    CCmdTarget::~CCmdTarget()
    {
    #ifndef _AFX_NO_OLE_SUPPORT
             if (m_xDispatch.m_vtbl != 0) 
                    ((COleDispatchImpl*)&m_xDispatch)->Disconnect();
             ASSERT(m_dwRef <= 1); //<-中断在这句 
    #endif
    #ifdef _AFXDLL 
            m_pModuleState = NULL; 
    #endif 
    } 
    

    此时m_dwRef的值,等于Microsoft Office Spreadsheet 11.0控件获得焦点(鼠标设置)的次数+1。 
    使用Microsoft Office Spreadsheet 10.0控件(Office 2002带的)则没有这个问题。
    应该是11.0版本的控件代码存在bug。
    说明该控件作者在控件取得焦点时,++m_dwRef,而在控件失去焦点时,却没有相应的--m_dwRef。导致出现了上面所述的规律。 
    release版本不会出现断言失败框,如果想在debug下关闭的烦人的断言失败框,最佳解决办法如下:
    添加对话框WM_DESTROY消息处理,添加如下代码。
    void CxxxDlg::-OnDestroy()
    { 
    #ifdef _DEBUG 
        int old = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); 
    #endif 
        CDialog::OnDestroy(); 
    #ifdef _DEBUG 
        _CrtSetReportMode(_CRT_ASSERT, old); 
    #endif
    }
    

  • 相关阅读:
    网络流 方阵移动
    NOI2019滚粗记
    PKUSC2019游记
    CQOI十二省联考游记
    数学结论题 书堆
    计算几何 大灾变
    51NOD 1773 A国的贸易
    BZOJ 3944
    51Nod 1238
    NOIP2018游记
  • 原文地址:https://www.cnblogs.com/madhenry/p/2027261.html
Copyright © 2011-2022 走看看