Sdílet prostřednictvím


Implementace CComObject, CComAggObject a CComPolyObject

Třídy šablonY CComObject, CComAggObject a CComPolyObject jsou vždy nejvíce odvozené třídy v řetězu dědičnosti. Je jejich zodpovědností zvládnout všechny metody v IUnknown: QueryInterface, AddRef, a Release. Kromě toho CComAggObject a CComPolyObject (pokud se používá pro agregované objekty) poskytují speciální počítání odkazů a QueryInterface sémantiku vyžadované pro vnitřní neznámý objekt.

Bez ohledu na to, CComAggObjectCComPolyObject jestli CComObjectdeklarujete jedno (nebo žádné) z následujících maker, nebo zda se používá, závisí na tom, zda deklarujete jedno (nebo žádné) z následujících maker:

Makro Účinnost
DECLARE_NOT_AGGREGATABLE Vždy používá CComObject.
DECLARE_AGGREGATABLE Použije CComAggObject , pokud je objekt agregovaný a CComObject pokud ne. CComCoClass obsahuje toto makro, takže pokud nejsou ve vaší třídě deklarována žádná z DECLARE_*_AGGREGATABLE maker, bude to výchozí hodnota.
DECLARE_ONLY_AGGREGATABLE Vždy používá CComAggObject. Vrátí chybu, pokud objekt není agregován.
DECLARE_POLY_AGGREGATABLE ATL vytvoří instanci CComPolyObject<CYourClass> při IClassFactory::CreateInstance volání. Při vytváření se zkontroluje hodnota vnější neznámé hodnoty. Pokud má hodnotu NULL, IUnknown implementuje se pro neagregovaný objekt. Pokud vnější neznámý není NULL, IUnknown je implementováno pro agregovaný objekt.

Výhodou použití CComAggObject a CComObject je, že implementace IUnknown je optimalizovaná pro typ vytvářeného objektu. Například neagregovaný objekt potřebuje pouze počet odkazů, zatímco agregovaný objekt potřebuje počet odkazů pro vnitřní neznámý i ukazatel na vnější neznámý objekt.

Výhodou použití CComPolyObject je, že se v modulu nemusíte zabývat CComAggObject CComObject agregovanými a neagregovanými případy. Jeden CComPolyObject objekt zpracovává oba případy. To znamená, že v modulu existuje jenom jedna kopie virtuální tabulky a jedna kopie funkcí. Pokud je vaše virtuální tabulka velká, může se tím podstatně zmenšit velikost modulu. Pokud je však tabulka vtable malá, může použití CComPolyObject vést k mírně větší velikosti modulu, protože není optimalizovaná pro agregovaný nebo neagregovaný objekt, jak jsou CComAggObject a CComObject.

Viz také

Základy ATL – objekty COM
Agregační makra a makra objektu pro vytváření tříd