由MFC替换到BCG时,多次界面操作后,系统不响应

程序不响应时,看堆栈是停留在CInitGDIPlus::ReleaseGDIPlus这个函数里,但是整个模块没有CImage类的对象,只有CImagelist对象,且操作时,并未进入含CImagelist的界面。
模块说明:由其他atl模块调用的dll,在析构中调用bcgcleanup没有效果。
想知道怎么能正常退出,谢谢

bcg

2个回答

所有的CImage对象都应该在堆上创建并且在DLL_PROCESS_DETACH之前销毁。明显bcg没有控制好自己的对象的生命期(大概是依赖于AfxGlobalsRelease),所以如果你要用BCG。就只能用扩展DLL了。

参考

  • FreeLibrary卡死问题
  • 微软知识库文章322909 FIX: DLL that uses ATL CImage class may cause a deadlock in a process. (没有在线版本,有旧的MSDN光盘的话可以去上面找找)
jiangsheng
蒋晟 回复qq_37512015: 1 你需要使用DLL版本的MFC 不然每个模块有单独的s_initGDIPlus 2 确保最后一个被销毁的CImage对象是你的exe的而不是DLL的,这样DLLMain里CInitGDIPlus::m_nCImageObjects永远不是0,所以ReleaseGDIPlus不会执行
一年多之前 回复
qq_37512015
qq_37512015 已经是扩展DLL了,还是存在无法正确销毁的问题,就是hang在CInitGDIPlus::ReleaseGDIPlus
一年多之前 回复

单独替换CComboBox时,不会出现不响应,如果将CComboBox和propertypage,propertysheet同时替换为BCG的,就会出现操作界面退出后,程序整体不响应的情况

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐