ATL COM对象崩溃问题一例

先单步调试,找到崩溃处代码为:

CComObject<foo>* p;

CComObject<foo>::CreateInstance(&p); //<==此处

这应该是很正常的用法,排除了代码不正确的问题。继续深入CreateInstance函数,崩溃在altcom库文件中:

CComObject<Base>* p = NULL;

ATLTRY(p = new CComObject<Base>()); //<==此处

只是一个简单的new函数,怎么会崩溃呢?无非是三种情况:1.new执行失败;2.构造函数执行失败;3.赋值函数执行失败。

在我的VS2005上,只能看到new函数执行成功了,接下来再单步执行时,直接弹出错误对话框。无奈,只得打开汇编窗口:

mov dword ptr [ecx+8],offset ATL::CComObject<CMyClass>::`vftable' (????????h) 
mov eax,dword ptr [ATL::_pAtlModule (????????h)] 
mov edx,dword ptr [eax] <==此处

在立即窗口中发现eax值为0,访问eax指针时发生读取违例。研读这段汇编代码,我判断是在执行CComObject某函数时,取ATL::_pAtlModule指针想执行函数,但该指针为空。

最后在网上找到了解决方案,在工程中加入如下代码:

CComModule _Module;
extern __declspec(selectany) CAtlModule* _pAtlModule=&_Module;
估计这是ATL工程默认会生成的一个全局Module,我的工程以前只生成了MFC的Module,用不到Atl Module时感觉没问题,但是一旦用到了就会崩溃。

解决方案的网址为http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/6de21bab-7786-497f-99ba-c40de8ff1320/。其中还进一步解释了引起崩溃的代码为:

CComObject(void* = NULL) throw()
{
_pAtlModule->Lock();
}

调用_pAtlModule的Lock函数时,_pAtlModule为空引发崩溃。

原文地址:https://www.cnblogs.com/gomen/p/3092986.html