DLL卸载顺序问题

hydra2004 2008-06-30 04:10:38
有个COM DLL工程(DLL A),其中用到了一个全局的变量,变量类型是指向另一个COM DLL(DLL B)中的对象的智能指针CComPtr<IXxx>,现在发现在应用程序关闭时会弹出内存不能读的出错信息,经调试发现DLL A中的全局的智能指针在析构时调用内部接口指针的Release()方法时出错,原因是此时DLL B已经先被卸载了,内存中早已没有了Release()函数当然会出错。

令我奇怪的是,DLL A中还持有一个DLL B中对象的实例,这时此对象内部的引用计数应该是大于0的,为什么DLL B还是会先于DLL A被卸载呢?这样的问题该怎么解决?

另外我试了在DLL中使用一个全局的ADO Connection对象,在程序退出的时候也是有相同的问题,似乎ADO的DLL也是先被卸载,导致Connection对象在Release()的时候出错...
...全文
115 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurry281 2008-06-30
  • 打赏
  • 举报
回复
xue xi
hydra2004 2008-06-30
  • 打赏
  • 举报
回复
仔细想了想,应该是可以用接口指针来代替智能指针,这样程序退出的时候就不会自动调用Release()方法了,但这样总感觉不是很"优雅",毕竟是要依靠操作系统来释放全局对象,也不知道会不会产生内存泄漏,希望能有更好的办法
scq2099yt 2008-06-30
  • 打赏
  • 举报
回复
可以用写日志的方式测试调用顺序
hydra2004 2008-06-30
  • 打赏
  • 举报
回复
是全局变量的问题,但既然全局变量还存在,DLL B不应该被卸载的啊,但它就是先于DLL A被卸载了,让我很郁闷。

我们的项目包含了一堆COM DLL,为了避免打开太多数据库连接,里面都用了全局的ADO Connection对象,有什么好办法解决此类问题吗?
pomelowu 2008-06-30
  • 打赏
  • 举报
回复
你看到的DLL A中还有DLL B的实例是因为全局变量的存在吧。。。全局对象析构的时机太晚导致的冲突。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧