CActiveXUI的一个Bug
来源:互联网 发布:世界粮农组织数据库 编辑:程序博客网 时间:2024/06/05 15:26
如果主窗口直接用变量生成,则关闭窗口时会产生崩溃
如果用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目前的重心是写入门教程,加之水平有限,所以不能短时间从根本上解决这个问题,就坐等大神啦~~~
原文:http://www.cnblogs.com/Alberl/p/3352131.html
0 0
- CActiveXUI的一个Bug
- 微软的一个bug?
- OracleParameter 的一个bug
- FireFox的一个bug
- 微软的一个BUG
- Tencent 的一个Bug
- 一个ComboBox的Bug
- WindowsXP的一个Bug
- QQ的一个BUG
- JCreator的一个BUG
- Word2007的一个bug
- hibernate3的一个bug
- ICTCLAS的一个bug
- CMonthCalCtrl的一个BUG
- Delphi2007的一个Bug?
- VS2005的一个BUG
- VC005的一个BUG
- VC6的一个bug???
- ng1.3+表单验证<AngularJs>
- java 软引用、弱引用、强引用、虚引用的解析
- C++实验2—学生成绩
- checkio the most frequent weekdays
- IOS Autolayout(VFL) 处理子视图居中
- CActiveXUI的一个Bug
- 关于一个多线程类的设计方法
- HashMap与HashTable解读(一)
- 南阳理工学院个人积分赛第四场【总结】
- 网络图片人脸识别并根据人脸焦点显示图片
- 非数字正则表达式
- Android之Activity跳转方式
- 把一个view上的点转到另一个view坐标系
- Ubuntu 切换grails环境变量并立即生效