ATL对COM实体身份的支持(二)—— CComObjectRootBase
下面是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;
};
};
{
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。