下面是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 閱讀(1515)
評論(0) 編輯 收藏 引用 所屬分類:
心得