Partilhar via


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

Outros recursos

Agregação e fábrica de classes macros