實作 CComObject、CComAggObject 和 CComPolyObject
樣板類別 CComObject, CComAggObject,然後, CComPolyObject 永遠在繼承鏈結中的大多數的衍生類別。 為其負責處理所有在 IUnknown的方法: QueryInterface、 AddRef和 版本。 此外, CComAggObject 和 CComPolyObject (在用於彙總物件) 提供計數特殊的參考與這個內部未知的必要 QueryInterface 語意。
是否使用 CComObject、 CComAggObject或 CComPolyObject 取決於您是否已宣告之一 (或) 下列巨集:
巨集 |
作用 |
---|---|
DECLARE_NOT_AGGREGATABLE |
永遠使用 CComObject。 |
DECLARE_AGGREGATABLE |
使用 CComAggObject ,如果物件彙總和 CComObject ,否則會傳回。 CComCoClass 做包含這個巨集,如果 DECLARE_*_AGGREGATABLE 巨集都在您的類別中並未宣告任何建構函式,這會是預設值。 |
DECLARE_ONLY_AGGREGATABLE |
永遠使用 CComAggObject。 如果物件沒有彙總,則傳回 FALSE。 |
DECLARE_POLY_AGGREGATABLE |
當呼叫時, IClassFactory::CreateInstance , ATL CComPolyObject<CYourClass> 建立執行個體。 在建立時,則外部未知的值進行檢查。 如果是 NULL, IUnknown 為 nonaggregated 物件上實作。 如果這個外部未知的參數不是 NULL, IUnknown 為彙總的物件上實作。 |
使用 CComAggObject 和 CComObject 的優點是 IUnknown 的實作會建立哪種最佳化物件。 例如,在中,而一個彙總物件需要內部未知的參考次數和指標至外部 UNKNOWN,一 nonaggregated 物件只需要參考計數。
使用 CComPolyObject 的優點是您不會處理 CComAggObject 和的 CComObject 於模組彙總和 nonaggregated 情況。 單一 CComPolyObject 物件控制代碼兩種情況。 這表示只有一個複本的 vtable 和函式的一個複本存在於模組。 如果您 vtable 非常大,所以可以大幅降低模組大小。 不過,因此,如果您 vtable 很小,使用 CComPolyObject 可能造成更大的模組大小,因為它沒有為彙總或 nonaggregated 最佳化物件,就像 CComAggObject 和 CComObject。