Implementowanie klas CComObject, CComAggObject i CComPolyObject
Klasy szablonów CComObject, CComAggObject i CComPolyObject są zawsze najbardziej pochodnymi klasami w łańcuchu dziedziczenia. Jest to ich odpowiedzialność za obsługę wszystkich metod w systemach IUnknown
: QueryInterface
, AddRef
i Release
. Ponadto CComAggObject
i CComPolyObject
(w przypadku użycia dla zagregowanych obiektów) zapewniają specjalne zliczanie odwołań i QueryInterface
semantyka wymagana dla wewnętrznej nieznanej.
Niezależnie od tego, czy CComObject
używany jest element , CComAggObject
czy CComPolyObject
też jest używany, zależy od tego, czy zadeklarować jedno (lub żadne) z następujących makr:
Makro | Efekt |
---|---|
DECLARE_NOT_AGGREGATABLE | Zawsze używa metody CComObject . |
DECLARE_AGGREGATABLE | Używa CComAggObject wartości , jeśli obiekt jest zagregowany, a CComObject jeśli nie. CComCoClass zawiera to makro, więc jeśli żadne z makr DECLARE_*_AGGREGATABLE nie zostaną zadeklarowane w klasie, będzie to ustawienie domyślne. |
DECLARE_ONLY_AGGREGATABLE | Zawsze używa metody CComAggObject . Zwraca błąd, jeśli obiekt nie jest agregowany. |
DECLARE_POLY_AGGREGATABLE | Usługa ATL tworzy wystąpienie klasy CYourClass> obiektu CComPolyObject<, gdy IClassFactory::CreateInstance jest wywoływana. Podczas tworzenia sprawdzana jest wartość zewnętrznej nieznanej. Jeśli ma wartość NULL, IUnknown jest implementowany dla obiektu nieagregowanego. Jeśli zewnętrzna nieznana wartość nie ma wartości NULL, IUnknown jest implementowana dla zagregowanego obiektu. |
Zaletą użycia i CComAggObject
CComObject
jest to, że implementacja IUnknown
jest zoptymalizowana pod kątem rodzaju tworzonego obiektu. Na przykład obiekt nieagregowany wymaga tylko liczby odwołań, podczas gdy zagregowany obiekt wymaga zarówno liczby odwołań dla wewnętrznej nieznanej, jak i wskaźnika do zewnętrznej nieznanej.
Zaletą użycia CComPolyObject
jest unikanie CComAggObject
obsługi zagregowanych i nieagregowanych przypadków zarówno w module, jak i CComObject
w module. Pojedynczy CComPolyObject
obiekt obsługuje oba przypadki. Oznacza to, że w module istnieje tylko jedna kopia tabeli wirtualnej i jedna kopia funkcji. Jeśli twoja tabela wirtualna jest duża, może to znacznie zmniejszyć rozmiar modułu. Jeśli jednak tabela wirtualna jest mała, użycie CComPolyObject
metody może spowodować nieco większy rozmiar modułu, ponieważ nie jest zoptymalizowany pod kątem zagregowanego lub nieagregowanego obiektu, podobnie jak i CComAggObject
CComObject
.
Zobacz też
Podstawowe informacje na temat obiektów COM ATL
Makra agregacji i fabryki klas