Implementazione di CComObject, CComAggObject e CComPolyObject

Le classi modello CComObject, CComAggObject e CComPolyObject sono sempre le classi più derivate nella catena di ereditarietà. È responsabilità di gestire tutti i metodi in IUnknown: QueryInterface, AddRefe Release. Inoltre, CComAggObject e CComPolyObject (se usato per gli oggetti aggregati) forniscono il conteggio dei riferimenti speciali e QueryInterface la semantica necessari per l'elemento sconosciuto interno.

L'utilizzo di CComObject, CComAggObjecto CComPolyObject dipende dal fatto che si dichiari una o nessuna delle macro seguenti:

Macro Effetto
DECLARE_NOT_AGGREGATABLE Usa CComObjectsempre .
DECLARE_AGGREGATABLE CComAggObject Usa se l'oggetto è aggregato e CComObject in caso contrario. CComCoClass contiene questa macro, quindi se nessuna delle macro DECLARE_*_AGGREGATABLE viene dichiarata nella classe, questa sarà l'impostazione predefinita.
DECLARE_ONLY_AGGREGATABLE Usa CComAggObjectsempre . Restituisce un errore se l'oggetto non è aggregato.
DECLARE_POLY_AGGREGATABLE ATL crea un'istanza di CComPolyObject<CYourClass> quando IClassFactory::CreateInstance viene chiamato. Durante la creazione, viene controllato il valore dell'elemento sconosciuto esterno. Se è NULL, IUnknown viene implementato per un oggetto nonaggregato. Se l'elemento sconosciuto esterno non è NULL, IUnknown viene implementato per un oggetto aggregato.

Il vantaggio dell'uso CComAggObject di e CComObject è che l'implementazione di IUnknown è ottimizzata per il tipo di oggetto da creare. Ad esempio, un oggetto nonaggregato richiede solo un conteggio dei riferimenti, mentre un oggetto aggregato richiede sia un conteggio dei riferimenti per l'elemento sconosciuto interno che un puntatore all'oggetto sconosciuto esterno.

Il vantaggio dell'uso CComPolyObject consiste nell'evitare di avere sia CComAggObject che CComObject nel modulo per gestire i casi aggregati e non aggregati. Un singolo CComPolyObject oggetto gestisce entrambi i casi. Ciò significa che nel modulo è presente una sola copia della tabella virtuale e una copia delle funzioni. Se la tabella virtuale è grande, questa operazione può ridurre notevolmente le dimensioni del modulo. Tuttavia, se la tabella virtuale è piccola, l'uso CComPolyObject di può comportare dimensioni del modulo leggermente maggiori perché non è ottimizzato per un oggetto aggregato o nonaggregato, come sono CComAggObject e CComObject.

Vedi anche

Nozioni fondamentali sugli oggetti COM ATL
Macro di aggregazione e class factory