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.