• 3 CActiveXUI的一个Bug


    如果主窗口直接用变量生成,则关闭窗口时会产生崩溃
        
     
        如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_tWinMain改为下面这样:
    复制代码
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        CPaintManagerUI::SetInstance(hInstance);
        HRESULT Hr = ::CoInitialize(NULL);
        if( FAILED(Hr) ) return 0;
     
        CDuiFrameWnd *pFrame = new CDuiFrameWnd;    // 这里必须用new,否则有ActiveX控件时,关闭窗口会产生崩溃
        pFrame->Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
        pFrame->CenterWindow();
        pFrame->ShowModal();
     
        delete pFrame;
        ::CoUninitialize();
        return 0;
    }
    复制代码

        其根本原因是ActiveX控件使用了类似COM的方式,而却没有控制好作用域,所以导致析构时,CActiveXCtrl的成员变量m_pViewObject所指向的内存已经无效,因此产生了崩溃。之所以用new的方式不会崩溃,是因为new出来的内存,即使对象析构后,其内存还是有效的。

        由于其使用了类似COM的行为,有几处delete this,而Alberl并不了解微软自己的COM和ActiveX内部是怎么处理的,所以也就无法评价duilib的COM和ActiveX,当然啦,Alberl还是调试了一下,发现 ActiveXUI.cpp里面的那几个类都是模拟了COM的方式,采用了引用计数,但是那几个类的Release顺序貌似有点乱,而且那几个类互相包含,所以才造成析构时的那些问题,由于Alberl目前的重心是写入门教程,加之水平有限,所以不能短时间从根本上解决这个问题,就坐等大神啦~~~
  • 相关阅读:
    量化学习 | 配对交易 backtrader实现
    量化学习 | Tushare 基本面选股 (二)
    CVPR 2020 三篇有趣的论文解读
    量化学习 | Tushare和Backtrader初探(一)
    解决deepin网卡耗电异常及网速慢的问题
    linux省电三步骤
    扎心了
    解决IDEA卡在Resolving Maven dependencies问题
    关于生产环境和开发环境的介绍
    jQuery事件委托
  • 原文地址:https://www.cnblogs.com/a9999/p/3799489.html
Copyright © 2020-2023  润新知