Implementando CComObject, CComAggObject e CComPolyObject

As classes de modelo, CComObject, CComAggObjecte CComPolyObject sempre são classes derivadas mais na cadeia de herança. É sua responsabilidade para lidar com todos os métodos IUnknown: QueryInterface, AddRefe 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 o desconhecido interno.

Se CComObject, CComAggObjectou CComPolyObject é usado depende se você declarar a macro DECLARE_POLY_AGGREGATABLE e se o objeto está sendo agregado:

A vantagem de usar CComAggObject e CComObject é que a implementação de IUnknown está otimizada para o tipo de objeto está sendo criado. Por exemplo, um objeto nonaggregated só precisa uma Contar de referência, enquanto um objeto agregado precisa uma Contar de referência para o desconhecido interno e um ponteiro para o externo desconhecido.

A vantagem de usar CComPolyObject é que você evite ter ambos CComAggObject e CComObject no seu módulo para lidar com os cAmbosos agregados e nonaggregated. Um objeto simples CComPolyObject lida com ambos os casos. Isso significa que somente um copiar da vtable e uma cópia das funções existem em seu módulo. Se seu vtable for grande, isso pode diminuir substancialmente o tamanho do módulo. No entanto, se seu vtable for pequeno, usar CComPolyObject pode resultar em um tamanho ligeiramente maior do módulo porque ele não é otimizado para um objeto agregado ou nonaggregated, como CComAggObject e CComObject.

A macro DECLARE_POLY_AGGREGATABLE é adicionada automaticamente ao seu definição de classe, o Assistente de objeto ATL quando você cria um controle total ou controle do Internet Explorer. Para obter mais informações sobre o assistente, consulte Criando um projeto ATL.

Index