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
, AddRef
e 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
, CComAggObject
o CComPolyObject
dipende dal fatto che si dichiari una o nessuna delle macro seguenti:
Macro | Effetto |
---|---|
DECLARE_NOT_AGGREGATABLE | Usa CComObject sempre . |
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 CComAggObject sempre . 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