Implementação CComObject, CComAggObject e CComPolyObject
Classes de modelo CComObject, CComAggObject, and CComPolyObject sempre são as classes mais derivadas da cadeia de herança.É sua responsabilidade para lidar com todos os métodos em IUnknown: QueryInterface, AddRef, e Versão.Além disso, CComAggObject e CComPolyObject (quando usado para objetos agregados) fornecem a contagem de referência especial e QueryInterface semântica necessária para interno desconhecido.
Se CComObject, CComAggObject, ou CComPolyObject é usado depende se você declarar uma (ou none) as seguintes macros:
Macro |
Efeito |
---|---|
DECLARE_NOT_AGGREGATABLE |
Sempre usa CComObject. |
DECLARE_AGGREGATABLE |
UsaCComAggObject Se o objeto é agregado e CComObject Se não estiver. CComCoClass contém esta macro, se nenhuma do DECLARE_ * _AGGREGATABLE macros são declaradas na sua classe, esse será o padrão. |
DECLARE_ONLY_AGGREGATABLE |
Sempre usa CComAggObject. Retorna um erro se o objeto não é agregado. |
DECLARE_POLY_AGGREGATABLE |
ATL cria uma instância de CComPolyObject <cyourclass> when IClassFactory::CreateInstance é chamado.Durante a criação, o valor do externo desconhecido é verificado.Se for NULO, IUnknown é implementado para um objeto nonaggregated.Se desconhecido externo não for NULO, IUnknown é implementado para um objeto agregado. |
A vantagem de usar CComAggObject e CComObject é que a implementação do IUnknown é otimizado para o tipo de objeto que está sendo criado.Por exemplo, um objeto nonaggregated precisa apenas uma contagem de referência, enquanto um objeto agregado precisar uma contagem de referência interno desconhecido e um ponteiro para externo desconhecido.
A vantagem de usar CComPolyObject é evitar ter que ambos CComAggObject e CComObject no módulo para lidar com casos nonaggregated e agregados. Um único CComPolyObject objeto lida com ambos os casos. Isso significa que somente uma cópia do vtable e uma cópia das funções existir no seu módulo.Se seu vtable for grande, isso pode diminuir substancialmente o dimensionar do módulo.No entanto, se seu vtable for pequeno, usando CComPolyObject pode resultar em um dimensionar ligeiramente maior do módulo porque ele não é otimizado para um objeto agregado ou nonaggregated, assim sistema autônomo CComAggObject e CComObject.
Consulte também
Referência
Fundamentos de objetos COM de ATL