请大家一定要帮帮忙,我已经困惑好几天了!!
正如Dale Rogerson说的:由于一些细节问题没有解决,你最后不得不放弃!

解决方案 »

  1.   

    这是为了防止m_pUnknownInner调Release时,内部组件有可能调外部组件(就是CA自已)的Release,造成重复调用析构函数。
    我想,内部组件的引用计数总为1,而由外部组件来控制内部组件的生存期。
      

  2.   

    你可以自己看一下对象的引用计数,过去普通对象的引用计数器就在对象指针前一个字节。
    不知道com是不是一样
      

  3.   

    我这样哪儿不对?!
    CA::~CA()
      {InterlockedDecrement(&g_cComponenets);
       trace("Destroy self.");   
       if(m_pUnknownInner!=NULL)
               {
                 m_pUnknownInner->Release();
                  }
     }
      

  4.   

    Dale Rogerson为了简化,对一个COM class中的所有interface使用了一个引用计数
    但COM要求客户在使用时,不管是如何实现的,均当成每一个interface都有一个单独的引用计数
    只把m_pUnknownInner Release不合这一规则
    而在有些情形下,Release可能并不是如Dale那个例子中那么简单,里面可能还有一些资源的释放过程,这时,跳过接口IY的Release可能会造成难以预料的后果
      

  5.   

    对于集合对象引用计数由外部对象来管理,相对的是内部对象必须通过委托的形式将IUNKNOWN的对象交给外部来管理,这里可见ATL中对于集合的实现,有一个联合,其中容纳了引用计数和IUNKNOWN *,相信这种模型理解容易点吧!