Implementar CComObject, CComAggObject y CComPolyObject
Las clases de plantillas CComObject, CComAggObject y CComPolyObject siempre son las clases más derivadas de la cadena de herencia. Es su responsabilidad controlar todos los métodos de IUnknown
: QueryInterface
, AddRef
y Release
. Además, CComAggObject
y CComPolyObject
(cuando se usa para objetos agregados) proporcionan el recuento de referencias especial y la semántica QueryInterface
necesaria para el desconocido interno.
Si se usa CComObject
, CComAggObject
o CComPolyObject
depende de si declara una (o ninguna) de las siguientes macros:
Macro | Efecto |
---|---|
DECLARE_NOT_AGGREGATABLE | Siempre usa CComObject . |
DECLARE_AGGREGATABLE | Usa CComAggObject si el objeto se agrega y CComObject si no se agrega. CComCoClass contiene esta macro, por lo que si ninguna de las macros de DECLARE_*_AGGREGATABLE se declara en la clase , será el valor predeterminado. |
DECLARE_ONLY_AGGREGATABLE | Siempre usa CComAggObject . Devuelve un error si el objeto no se agrega. |
DECLARE_POLY_AGGREGATABLE | ATL crea una instancia de CComPolyObject<CYourClass> cuando se llama a IClassFactory::CreateInstance . Durante la creación, se comprueba el valor del elemento desconocido externo. Si es null, IUnknown se implementa para un objeto no agregado. Si el desconocido externo no es null, IUnknown se implementa para un objeto agregado. |
La ventaja de usar CComAggObject
y CComObject
es que la implementación de IUnknown
está optimizada para el tipo de objeto que se va a crear. Por ejemplo, un objeto no agregado solo necesita un recuento de referencias, mientras que un objeto agregado necesita un recuento de referencias para el desconocido interno y un puntero al desconocido externo.
La ventaja de usar CComPolyObject
es que evita tener tanto CComAggObject
como CComObject
en el módulo para controlar los casos agregados y no agregados. Un solo objeto CComPolyObject
controla ambos casos. Esto significa que solo existe una copia de la tabla virtual y una copia de las funciones existentes en el módulo. Si la tabla virtual es grande, esto puede reducir considerablemente el tamaño del módulo. Pero si la tabla virtual es pequeña, el uso de CComPolyObject
puede dar lugar a un tamaño de módulo ligeramente mayor porque no está optimizado para un objeto agregado o no agregado, como sí lo están CComAggObject
y CComObject
.
Consulte también
Aspectos básicos de los objetos ATL COM
Macros de agregación y generador de clases