下面是CComObjectRootBase的關(guān)鍵代碼:
class
?CComObjectRootBase
{
public
:
?????// 構(gòu)造支持
?????//
?????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);
????}
????
??? //?實(shí)體身份支持
??? //
????union
????{
????????long?m_dwRef;
???????? IUnknown*?m_pOuterUnknown;
????};
};
CComObjectRootBase主要功能分為:
(1)構(gòu)造支持:
????????????即FinalConstruct和FinalRelease,它們用于安全的構(gòu)造和銷(xiāo)毀對(duì)象。
(2)接口查詢支持
????????????通過(guò)接口映射表來(lái)完成接口查詢功能,詳細(xì)內(nèi)容見(jiàn)后面的文章。
(3)聚合狀態(tài)下引用計(jì)數(shù)操作的支持
????????????提供了將IUnknown請(qǐng)求委托給外部組件的支持。當(dāng)對(duì)象獨(dú)立存在時(shí),對(duì)引用計(jì)數(shù)操作的支持被放置于CComObjectRootEx中,因?yàn)樯婕暗搅颂组g和訪問(wèn)同步。
(4)實(shí)體身份支持
????????????使得對(duì)象可以獨(dú)立存在或者被聚合,因?yàn)檫\(yùn)行時(shí)刻對(duì)象只能以一種方式存在,所以使用了union。
posted on 2007-04-06 13:51
michael 閱讀(1539)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
心得