Duilib ---ActiveX的bug
转自http://www.cnblogs.com/Alberl/p/3352131.html
如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成
ActiveX的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出来的内存,即使对象析构后,其内存还是有效的。


浙公网安备 33010602011771号