Implémentation de CComObject, CComAggObject et CComPolyObject
Les classes de modèle CComObject, CComAggObject et CComPolyObject sont toujours les classes les plus dérivées de la chaîne d’héritage. Il est de leur responsabilité de gérer toutes les méthodes dans IUnknown
: QueryInterface
, AddRef
, et Release
. En outre, CComAggObject
et CComPolyObject
(lorsqu’ils sont utilisés pour les objets agrégés) fournissent le comptage et QueryInterface
la sémantique de référence spéciaux requis pour l’inconnu interne.
Si CComObject
, CComAggObject
ou CComPolyObject
est utilisé dépend de la déclaration d’une (ou aucune) des macros suivantes :
Macro | Effet |
---|---|
DECLARE_NOT_AGGREGATABLE | Utilise CComObject toujours . |
DECLARE_AGGREGATABLE | Utilise CComAggObject si l’objet est agrégé et CComObject s’il ne l’est pas. CComCoClass contient cette macro de sorte que si aucune des macros DECLARE_*_AGGREGATABLE n’est déclarée dans votre classe, il s’agit de la valeur par défaut. |
DECLARE_ONLY_AGGREGATABLE | Utilise CComAggObject toujours . Retourne une erreur si l’objet n’est pas agrégé. |
DECLARE_POLY_AGGREGATABLE | ATL crée une instance de CComPolyObject<CYourClass> quand elle IClassFactory::CreateInstance est appelée. Lors de la création, la valeur de l’inconnu externe est vérifiée. S’il s’agit de NULL, IUnknown est implémenté pour un objet non agrégé. Si l’inconnu externe n’est pas NULL, IUnknown est implémenté pour un objet agrégé. |
L’avantage de l’utilisation CComAggObject
et CComObject
est que l’implémentation est IUnknown
optimisée pour le type d’objet créé. Par exemple, un objet non agrégé a uniquement besoin d’un nombre de références, tandis qu’un objet agrégé a besoin à la fois d’un nombre de références pour l’inconnu interne et d’un pointeur vers l’inconnu externe.
L’avantage de l’utilisation CComPolyObject
est que vous évitez d’avoir à la fois CComAggObject
et CComObject
dans votre module pour gérer les cas agrégés et non agrégés. Un objet unique CComPolyObject
gère les deux cas. Cela signifie qu’une seule copie de la table virtuelle et une copie des fonctions existent dans votre module. Si votre vtable est volumineux, cela peut réduire considérablement la taille de votre module. Toutefois, si votre vtable est petit, l’utilisation CComPolyObject
peut entraîner une taille de module légèrement plus grande, car elle n’est pas optimisée pour un objet agrégé ou non agrégé, comme c’est le cas CComAggObject
et CComObject
.
Voir aussi
Principes de base des objets ATL COM
Agrégation et macros de fabrique de classe