有个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()的时候出错...

解决方案 »

  1.   

    你看到的DLL A中还有DLL B的实例是因为全局变量的存在吧全局对象析构的时机太晚导致的冲突。
      

  2.   

    是全局变量的问题,但既然全局变量还存在,DLL B不应该被卸载的啊,但它就是先于DLL A被卸载了,让我很郁闷。我们的项目包含了一堆COM DLL,为了避免打开太多数据库连接,里面都用了全局的ADO Connection对象,有什么好办法解决此类问题吗?
      

  3.   

    仔细想了想,应该是可以用接口指针来代替智能指针,这样程序退出的时候就不会自动调用Release()方法了,但这样总感觉不是很"优雅",毕竟是要依靠操作系统来释放全局对象,也不知道会不会产生内存泄漏,希望能有更好的办法