實作 CComObject、CComAggObject 和 CComPolyObject
CComObject、CComAggObject 和 CComPolyObject 範本 類別一律是繼承鏈結中衍生最多的 類別。 負責處理 中的所有方法 IUnknown
: QueryInterface
、 AddRef
和 Release
。 此外, CComAggObject
和 CComPolyObject
(用於匯總物件時)提供內部未知所需的特殊參考計數和 QueryInterface
語意。
是否 CComObject
使用 、 CComAggObject
或 CComPolyObject
取決於您是否宣告下列其中一個宏(或無一個):
Macro | 影響 |
---|---|
DECLARE_NOT_AGGREGATABLE | 一律使用 CComObject 。 |
DECLARE_AGGREGATABLE | 如果物件已匯總,則 CComObject 為 ,如果不是 ,則使用 CComAggObject 。 CComCoClass 包含此宏,因此,如果類別中未宣告任何DECLARE_*_AGGREGATABLE宏,則這會是預設值。 |
DECLARE_ONLY_AGGREGATABLE | 一律使用 CComAggObject 。 如果未匯總物件,則傳回錯誤。 |
DECLARE_POLY_AGGREGATABLE | 呼叫 時 IClassFactory::CreateInstance ,ATL 會建立 CComPolyObject < CYourClass > 的 實例。 在建立期間,會檢查外部未知的值。 如果是 Null, IUnknown 則會針對非匯總物件實作。 如果外部未知不是 Null, IUnknown 則會針對匯總物件實作。 |
使用 CComAggObject
和 CComObject
的優點是,的 IUnknown
實作已針對所建立的物件類型進行優化。 例如,非匯總物件只需要參考計數,而匯總的物件需要內部未知的參考計數和外部未知的指標。
使用 CComPolyObject
的優點是,您避免在 CComAggObject
模組中有 和 CComObject
來處理匯總和非匯總案例。 單 CComPolyObject
一物件會處理這兩種情況。 這表示只有一份 vtable 和一份函式存在於您的模組中。 如果您的 vtable 很大,這可能會大幅減少模組大小。 不過,如果您的 vtable 很小,使用 CComPolyObject
可能會導致模組大小略大,因為它未針對匯總或非匯總的物件進行優化,如同 CComAggObject
和 CComObject
。