Compartir a través de


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, AddRefy 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, CComAggObjecto 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