CComObjectRootEx

temp&latelt; classeThreadModel >
classe CComObjectRootEx: pubblico CComObjectRootBase

Parametri

ThreadModel

La classe cui metodi implementano il modello di threading desiderato. È possibile scegliere in modo esplicito il modello di threading impostando ThreadModel su CComSingleThreadModel, CComMultiThreadModelo CComMultiThreadModelNoCS. Si può accettare il modello di threading predefinita del server impostando ThreadModel su CComObjectThreadModel o CComGlobalsThreadModel.

CComObjectRootEx gestisce la gestione di oggetti riferimento conteggio degli oggetti non aggregati e aggregati. Essa detiene il conteggio dei riferimenti oggetto, se l'oggetto non è da aggregare e detiene il puntatore all'ignoto esterno se l'oggetto è essere aggregato. Per gli oggetti aggregati, CComObjectRootEx metodi possono essere utilizzati per gestire il fallimento dell'oggetto interno per costruire e per proteggere l'oggetto esterno dall'eliminazione quando vengono rilasciate le interfacce interne o viene eliminato l'oggetto interno.

Una classe che implementa un server COM deve ereditare da CComObjectRootEx o CComObjectRoot.

Se la definizione della classe specifica la macro DECLARE_POLY_AGGREGATABLE , ATL crea un'istanza di CComPolyObjectlt;CClasse > quando viene chiamato IClassFactory::CreateInstance . Durante la creazione, viene controllato il valore dell'ignoto esterno. Se è NULL, viene implementata IUnknown per un oggetto non aggregato. Se l'ignoto esterno non è NULL, verrà implementato l'IUnknown per un oggetto aggregato.

Se la classe non specifica la macro DECLARE_POLY_AGGREGATABLE , ATL crea un'istanza di CComObjectlt;CClasse > per oggetti aggregati o un'istanza di CComAggObject <CYourClass> per oggetti non aggregati.

Il vantaggio di usare CComPolyObject è che si evita di avere sia CComAggObject e CComObject nel modulo per gestire i casi aggregati e non aggregati. Un singolo oggetto CComPolyObject gestisce entrambi i casi. Pertanto, solo una copia di vtable e una copia delle funzioni presenti nel modulo. Se tuo vtable è grande, questo può ridurre notevolmente le dimensioni del modulo. Tuttavia, se tuo vtable è piccola, utilizzando CComPolyObject può comportare una dimensione leggermente più grande del modulo perché esso non è ottimizzato per un oggetto non aggregato o aggregato, come sono CComAggObject e CComObject.

La macro DECLARE_POLY_AGGREGATABLE viene automaticamente aggiunto alla definizione della classe dalla creazione guidata oggetto ATL quando si crea un controllo completo o il controllo di Internet Explorer.

Se l'oggetto viene aggregata, IUnknown viene implementata da CComAggObject o CComPolyObject. Queste classi delegano chiamate QueryInterface, AddRefe Release a CComObjectRootEx OuterQueryInterface, OuterAddRefe OuterRelease di trasmettere all'esterno ignoto. In genere, si esegue l'override di CComObjectRootEx::FinalConstruct in classe per creare oggetti aggregati ed eseguire l'override di CComObjectRootEx::FinalRelease per liberare tutti gli oggetti aggregati.

Se l'oggetto non viene aggregata, IUnknown viene implementata da CComObject o CComPolyObject. In questo caso, chiamate QueryInterface, AddRefe Release sono delegate a InternalQueryInterface CComObjectRootEx, InternalAddRefe InternalRelease per eseguire le operazioni di effettive.

# include lt;atlcom.h>

Membri della classe

Vedere a&nchenbsp;CComAggObject, CComObject, CComPolyObject

Index