共用方式為


實作 CComObject、CComAggObject 和 CComPolyObject

CComObject、CComAggObject CComPolyObject 範本 類別一律是繼承鏈結中衍生最多的 類別。 負責處理 中的所有方法 IUnknownQueryInterfaceAddRefRelease 。 此外, CComAggObjectCComPolyObject (用於匯總物件時)提供內部未知所需的特殊參考計數和 QueryInterface 語意。

是否 CComObject 使用 、 CComAggObjectCComPolyObject 取決於您是否宣告下列其中一個宏(或無一個):

Macro 影響
DECLARE_NOT_AGGREGATABLE 一律使用 CComObject
DECLARE_AGGREGATABLE 如果物件已匯總,則 CComObject 為 ,如果不是 ,則使用 CComAggObjectCComCoClass 包含此宏,因此,如果類別中未宣告任何DECLARE_*_AGGREGATABLE宏,則這會是預設值。
DECLARE_ONLY_AGGREGATABLE 一律使用 CComAggObject 。 如果未匯總物件,則傳回錯誤。
DECLARE_POLY_AGGREGATABLE 呼叫 時 IClassFactory::CreateInstance ,ATL 會建立 CComPolyObject < CYourClass > 實例。 在建立期間,會檢查外部未知的值。 如果是 Null, IUnknown 則會針對非匯總物件實作。 如果外部未知不是 Null, IUnknown 則會針對匯總物件實作。

使用 CComAggObjectCComObject 的優點是,的 IUnknown 實作已針對所建立的物件類型進行優化。 例如,非匯總物件只需要參考計數,而匯總的物件需要內部未知的參考計數和外部未知的指標。

使用 CComPolyObject 的優點是,您避免在 CComAggObject 模組中有 和 CComObject 來處理匯總和非匯總案例。 單 CComPolyObject 一物件會處理這兩種情況。 這表示只有一份 vtable 和一份函式存在於您的模組中。 如果您的 vtable 很大,這可能會大幅減少模組大小。 不過,如果您的 vtable 很小,使用 CComPolyObject 可能會導致模組大小略大,因為它未針對匯總或非匯總的物件進行優化,如同 CComAggObjectCComObject

另請參閱

ATL COM 物件的基本概念
彙總和 Class Factory 巨集