随笔-6  评论-0  文章-16  trackbacks-0

下面是CComObjectRootBase的关键代码:

class  CComObjectRootBase
{
public :
     // 构造支持
     //
  
   HRESULT FinalConstruct();
     void FinalRelease(); 

     //  接口查询支持
     //
     static HRESULT WINAPI InternalQueryInterface(void* pThis,
        
const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject);
   
    static HRESULT WINAPI _Break(void*, REFIID iid, void**  , DWORD_PTR );
    static HRESULT WINAPI _NoInterface(void*  , REFIID void**  , DWORD_PTR );
    static HRESULT WINAPI _Creator(void* pv, REFIID iid, void**ppvObject, DWORD_PTR dw);
    static HRESULT WINAPI _Delegate(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw);
   
 static HRESULT WINAPI _Chain(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw);
   
static HRESULT WINAPI _ChainAttr(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw);
   
 static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw);

    //  聚合支持
    //
 
   ULONG OuterAddRef()
    {
        
return m_pOuterUnknown->AddRef();
    }
    ULONG OuterRelease()
    {
        
return m_pOuterUnknown->Release();
    }
    HRESULT OuterQueryInterface(REFIID iid, 
void ** ppvObject)
    {
        
return m_pOuterUnknown->QueryInterface(iid, ppvObject);
    }
    
    // 实体身份支持
    //
    union
    {
        
long m_dwRef;
         IUnknown
* m_pOuterUnknown;
    };
};

CComObjectRootBase主要功能分为:
(1)构造支持:
            即FinalConstruct和FinalRelease,它们用于安全的构造和销毁对象。
(2)接口查询支持
            通过接口映射表来完成接口查询功能,详细内容见后面的文章。
(3)聚合状态下引用计数操作的支持
            提供了将IUnknown请求委托给外部组件的支持。当对象独立存在时,对引用计数操作的支持被放置于CComObjectRootEx中,因为涉及到了套间和访问同步。
(4)实体身份支持
            使得对象可以独立存在或者被聚合,因为运行时刻对象只能以一种方式存在,所以使用了union。
posted on 2007-04-06 13:51 michael 阅读(1502) 评论(0)  编辑 收藏 引用 所属分类: 心得

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理