Udostępnij za pośrednictwem


Realizacji CComObject, CComAggObject i CComPolyObject

Szablon klasy CComObject, CComAggObject, i CComPolyObject są zawsze najbardziej klas pochodnych w łańcuchu dziedziczenia.Jest ich odpowiedzialność za obsługę wszystkich metod w IUnknown: QueryInterface, AddRef, i wersji.Ponadto CComAggObject i CComPolyObject (gdy jest używane dla obiektów zagregowane) zapewnić zliczanie specjalne odniesienie i QueryInterface semantyki wymaganego wewnętrznego nieznany.

Czy CComObject, CComAggObject, lub CComPolyObject jest używana zależy od zadeklarować jednej (lub brak) następujące makra:

Makro

Efekt

DECLARE_NOT_AGGREGATABLE

Zawsze używa CComObject.

DECLARE_AGGREGATABLE

Używa CComAggObject , jeśli obiekt jest zagregowane i CComObject , jeśli nie jest.CComCoClassto makro zawiera więc jeśli żaden z DECLARE_ * _AGGREGATABLE makra są zadeklarowana w klasie, będzie to domyślny.

DECLARE_ONLY_AGGREGATABLE

Zawsze używa CComAggObject.Zwraca błąd, jeśli obiekt nie jest zagregowane.

DECLARE_POLY_AGGREGATABLE

ATL tworzy wystąpienie CComPolyObject <CYourClass> po IClassFactory::CreateInstance jest wywoływana.Podczas tworzenia jest sprawdzana wartość unknown zewnętrzne.Jeśli jest NULL, IUnknown dla obiektu nonaggregated.Jeśli nie jest nieznany zewnętrznej NULL, IUnknown jest zaimplementowana zagregowane obiektu.

Zaletą korzystania z CComAggObject i CComObject jest wykonania IUnknown jest zoptymalizowana ze względu na rodzaj tworzonego obiektu.Na przykład obiektu nonaggregated musi tylko liczbę odwołań, natomiast potrzebuje zagregowane obiektu licznika odwołań do nieznanego wewnętrznego i wskaźnik do zewnętrznego nieznany.

Zaletą korzystania z CComPolyObject jest uniknięcie posiadające obie CComAggObject i CComObject w modułu obsługi przypadkach zagregowanych i nonaggregated.Jeden CComPolyObject obiekt obsługuje oba przypadki.Oznacza to, że tylko jedna kopia vtable i jedną kopię funkcji istnieje w module.Rozmiar modułu można zmniejszyć znacznie vtable użytkownika jest duża.Jednakże, jeśli Twój vtable jest mały, za pomocą CComPolyObject może spowodować nieco większy rozmiar modułu, ponieważ nie jest zoptymalizowany dla obiektu nonaggregated lub zagregowane są CComAggObject i CComObject.

Zobacz też

Informacje

Podstawy obiektów COM ATL

Inne zasoby

Agregacja i klasy fabrycznej makra