Udostępnij za pośrednictwem


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, AddRefi 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 CComObjectużywany jest element , CComAggObjectczy 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