CComPolyObject 類別
這個類別會 IUnknown
針對匯總或非匯總的物件實作。
語法
template<class contained>
class CComPolyObject : public IUnknown,
public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>
參數
包含
您的類別衍生自 CComObjectRoot 或 CComObjectRootEx,以及您想要在 物件上支援的任何其他介面。
成員
公用建構函式
名稱 | 描述 |
---|---|
CComPolyObject::CComPolyObject | 建構函式。 |
CComPolyObject::~CComPolyObject | 解構函式。 |
公用方法
名稱 | 描述 |
---|---|
CComPolyObject::AddRef | 遞增對象的參考計數。 |
CComPolyObject::CreateInstance | (靜態)可讓您建立新的 CComPolyObject contained <>物件,而不需要 CoCreateInstance 的額外負荷。 |
CComPolyObject::FinalConstruct | 執行的最終初始化 m_contained 。 |
CComPolyObject::FinalRelease | 執行的最終解構 m_contained 。 |
CComPolyObject::QueryInterface | 擷取所要求介面的指標。 |
CComPolyObject::Release | 遞減對象的參考計數。 |
公用資料成員
名稱 | 描述 |
---|---|
CComPolyObject::m_contained | IUnknown 如果對象已匯總,或IUnknown 未匯總物件,則委派對外部未知物件的呼叫。 |
備註
CComPolyObject
會 實作匯總或非匯總物件的 IUnknown 。
建立 的實例 CComPolyObject
時,會檢查外部未知的值。 如果是 NULL, IUnknown
則會針對非匯總物件實作。 如果外部未知不是 NULL, IUnknown
則會針對匯總物件實作。
使用 CComPolyObject
的優點是避免在模組中同時擁有 CComAggObject 和 CComObject 來處理匯總和非匯總案例。 單 CComPolyObject
一物件會處理這兩種情況。 這表示只有一份 vtable 和一份函式存在於您的模組中。 如果您的 vtable 很大,這可能會大幅減少模組大小。 不過,如果您的 vtable 很小,使用 CComPolyObject
可能會導致模組大小略大,因為它未針對匯總或非匯總的對象進行優化,如同 CComAggObject
和 CComObject
。
如果在對象的類別定義中指定了DECLARE_POLY_AGGREGATABLE巨集, CComPolyObject
將會用來建立物件。 如果您使用 ATL 專案精靈建立完整控件或 Internet Explorer 控件,則會自動宣告DECLARE_POLY_AGGREGATABLE。
如果匯總,則 CComPolyObject
物件有自己的 IUnknown
,與外部物件的分開,並維護其本身的 IUnknown
參考計數。 CComPolyObject
會使用 CComContainedObject 委派給外部未知。
如需匯總的詳細資訊,請參閱 ATL COM 物件的基本概念一文。
繼承階層架構
CComObjectRootBase
IUnknown
CComPolyObject
需求
標頭: atlcom.h
CComPolyObject::AddRef
遞增 對象的參考計數。
STDMETHOD_(ULONG, AddRef)();
傳回值
對於診斷或測試而言可能很有用的值。
CComPolyObject::CComPolyObject
建構函式。
CComPolyObject(void* pv);
參數
光伏
[in]如果要匯總物件,則為外部未知的指標,如果物件未匯總,則為 NULL。
備註
CComContainedObject
初始化數據成員,m_contained,並遞增模組鎖定計數。
解構函式會遞減模組鎖定計數。
CComPolyObject::~CComPolyObject
解構函式。
~CComPolyObject();
備註
釋放所有已配置的資源、呼叫 FinalRelease,並遞減模組鎖定計數。
CComPolyObject::CreateInstance
可讓您建立新的 CComPolyObjectcontained
<> 物件,而不需要 CoCreateInstance 的額外負荷。
static HRESULT WINAPI CreateInstance(
LPUNKNOWN pUnkOuter,
CComPolyObject<contained>** pp);
參數
pp
[out]CComPolyObject><contained
指標的指標。 如果 CreateInstance
失敗, pp 會設定為 NULL。
傳回值
標準 HRESULT 值。
備註
傳回的物件具有零的參考計數,因此立即呼叫 AddRef
,然後在完成時,使用 Release
釋放對象指標上的參考。
如果您不需要直接存取物件,但仍想要建立沒有額外負荷 CoCreateInstance
的新物件,請改用 CComCoClass::CreateInstance 。
CComPolyObject::FinalConstruct
在物件建構的最後階段呼叫,此方法會對m_contained數據成員執行任何最終初始化。
HRESULT FinalConstruct();
傳回值
標準 HRESULT 值。
CComPolyObject::FinalRelease
在對象解構期間呼叫,此方法會 釋放m_contained 數據成員。
void FinalRelease();
CComPolyObject::m_contained
衍生 自類別的 CComContainedObject 物件。
CComContainedObject<contained> m_contained;
參數
包含
[in]您的類別衍生自 CComObjectRoot 或 CComObjectRootEx,以及您想要在 物件上支援的任何其他介面。
備註
IUnknown
m_contained
如果匯總物件,呼叫會委派給外部未知的 ,如果物件未匯總,則委派給IUnknown
這個物件的 。
CComPolyObject::QueryInterface
擷取所要求介面的指標。
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
template <class Q>
HRESULT QueryInterface(Q** pp);
參數
Q
COM 介面。
iid
[in] 所要求介面的識別碼。
ppvObject
[out]由 iid 識別之介面指標的指標。 如果物件不支持這個介面, ppvObject 會設定為 NULL。
pp
[out]所識別 __uuidof(Q)
介面的指標。
傳回值
標準 HRESULT 值。
備註
對於匯總物件,如果要求的介面為 IUnknown
, QueryInterface
則會傳回匯總物件本身 IUnknown
的指標,並遞增參考計數。 否則,這個方法會透過 CComContainedObject
數據成員查詢介面, m_contained。
CComPolyObject::Release
遞減 對象的參考計數。
STDMETHOD_(ULONG, Release)();
傳回值
在偵錯組建中, Release
傳回可能對診斷或測試很有用的值。 在非偵錯組建中, Release
一律會傳回 0。