zoukankan      html  css  js  c++  java
  • 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为空引发崩溃。

  • 相关阅读:
    wait 和 notify 方法
    synchronized关键字
    多线程之thread、runnable的区别
    CodeForces 213 E
    hdu 3038 并查集
    zoj 3349 dp + 线段树优化
    hdu 4419 线段树 扫描线 离散化 矩形面积
    hdu 4262(线段树)
    hfut 1287
    hdu 4747 (线段树)
  • 原文地址:https://www.cnblogs.com/gomen/p/3092986.html
Copyright © 2011-2022 走看看