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