Condividi tramite


Implementare CComObject, CComAggObject e CComPolyObject

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

Se CComObject, CComAggObject, o CComPolyObject viene utilizzato dipende se non viene dichiarata una (o) di macro seguenti:

Macro

Effetto

DECLARE_NOT_AGGREGATABLE

Utilizza sempre CComObject.

DECLARE_AGGREGATABLE

Utilizza CComAggObject se l'oggetto verranno aggregati e CComObject caso contrario.CComCoClass contiene questa macro se pertanto nessuna delle macro DECLARE_*_AGGREGATABLE vengono dichiarate nella classe, questo sarà quello predefinito.

DECLARE_ONLY_AGGREGATABLE

Utilizza sempre CComAggObject.Restituisce un errore se l'oggetto non verranno aggregati.

DECLARE_POLY_AGGREGATABLE

ATL crea un'istanza CComPolyObject<CYourClass> quando IClassFactory::CreateInstance viene chiamato.Durante la creazione, il valore di sconosciuto esterno sia selezionata.Se è NULL, IUnknown viene implementato per un oggetto non aggregato.Se sconosciuto esterno non è NULL, IUnknown viene implementato per un oggetto aggregato.

Il vantaggio di l CComAggObject e CComObject l'implementazione IUnknown è ottimizzata per il tipo di oggetto creato.Ad esempio, un oggetto non aggregato necessita solo di un conteggio, mentre un oggetto aggregato necessita di un conteggio dei riferimenti per sconosciuto interno di un puntatore a sconosciuto esterno.

Il vantaggio di l CComPolyObject è di evitare di avere sia CComAggObject che CComObject nel modulo per gestire i casi aggregati e non aggregati.Singole un oggetto CComPolyObject entrambi i casi.Questo significa che una sola copia di vtable e una copia delle funzioni esistenti nel form.Se il riferimento è elevata, questo può ridurre notevolmente la dimensione del modulo.Tuttavia, se il riferimento è ridotto, utilizzando CComPolyObject possono comportare una dimensione leggermente più grande del modulo perché non è ottimizzata per un oggetto aggregato o non aggregato, come vengono CComAggObject e CComObject.

Vedere anche

Riferimenti

Principi fondamentali di oggetti COM ATL

Altre risorse

Macro di class factory e di aggregazione