Implementieren von CComObject, CComAggObject und CComPolyObject
Die Vorlagenklassen CComObject, CComAggObject und CComPolyObject sind immer die abgeleiteten Klassen in der Vererbungskette. Es liegt in ihrer Verantwortung, alle Methoden in IUnknown
: QueryInterface
, , AddRef
und Release
. Darüber hinaus stellen (CComPolyObject
bei Verwendung für aggregierte Objekte) die speziellen Verweiszählungen und QueryInterface
Semantik bereit, CComAggObject
die für das innere Unbekannte erforderlich sind.
Ob CComObject
, oder wird verwendet, hängt davon ab, CComAggObject
CComPolyObject
ob Sie eins (oder keine) der folgenden Makros deklarieren:
Makro | Effekt |
---|---|
DECLARE_NOT_AGGREGATABLE | Verwendet CComObject immer . |
DECLARE_AGGREGATABLE | Verwendet CComAggObject , wenn das Objekt aggregiert wird und CComObject nicht. CComCoClass enthält dieses Makro, sodass keines der DECLARE_*_AGGREGATABLE Makros in Ihrer Klasse deklariert wird, ist dies die Standardeinstellung. |
DECLARE_ONLY_AGGREGATABLE | Verwendet CComAggObject immer . Gibt einen Fehler zurück, wenn das Objekt nicht aggregiert wird. |
DECLARE_POLY_AGGREGATABLE | ATL erstellt eine Instanz von CComPolyObject<CYourClass> , wenn IClassFactory::CreateInstance sie aufgerufen wird. Während der Erstellung wird der Wert des äußeren Unbekannten überprüft. Wenn es NULL ist, IUnknown wird für ein nicht aggregiertes Objekt implementiert. Wenn das äußere Unbekannte nicht NULL ist, IUnknown wird für ein aggregiertes Objekt implementiert. |
Der Vorteil der Verwendung CComAggObject
und CComObject
ist, dass die Implementierung IUnknown
für die Art des erstellten Objekts optimiert ist. Ein nicht aggregiertes Objekt benötigt beispielsweise nur eine Verweisanzahl, während ein aggregiertes Objekt sowohl eine Verweisanzahl für das innere Unbekannte als auch einen Zeiger auf das äußere Unbekannte benötigt.
Der Vorteil der Verwendung CComPolyObject
besteht darin, dass Sie sowohl als auch CComAggObject
CComObject
in Ihrem Modul vermeiden, die aggregierten und nicht aggregierten Fälle zu verarbeiten. Ein einzelnes CComPolyObject
Objekt behandelt beide Fälle. Dies bedeutet, dass nur eine Kopie der vtable und eine Kopie der Funktionen in Ihrem Modul vorhanden ist. Wenn die vtable groß ist, kann dies die Modulgröße erheblich verringern. Wenn die vtable jedoch klein ist, kann die Verwendung CComPolyObject
zu einer etwas größeren Modulgröße führen, da sie nicht für ein aggregiertes oder nicht aggregiertes Objekt optimiert ist, wie es sind CComAggObject
und CComObject
.
Siehe auch
Grundlagen von ARL COM-Objekten
Aggregation und Klassenfactory-Makros