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, CComAggObject
CComPolyObject
jestli CComObject
deklarujete 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