Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As classes de modelo CComObject, CComAggObject e CComPolyObject são sempre as classes mais derivadas na cadeia de herança. É sua responsabilidade lidar com todos os métodos em IUnknown: QueryInterface, AddRef, e Release. 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, CComAggObject, ou CComPolyObject é usado depende se você declara uma (ou nenhuma) das seguintes macros:
| Macro | Efeito |
|---|---|
| DECLARAR_NÃO_AGREGÁVEL | Sempre usa CComObject. |
| DECLARE_AGGREGATABLE | Usa CComAggObject se o objeto estiver agregado e CComObject se o objeto não estiver.
CComCoClass contém essa macro, portanto, se nenhuma das macros DECLARE_*_AGGREGATABLE for declarada em sua classe, esse será o padrão. |
| DECLARE_ONLY_AGGREGATABLE | Sempre usa CComAggObject. Retorna um erro se o objeto não estiver agregado. |
| DECLARE_POLY_AGGREGATABLE | ATL cria uma instância de CComPolyObject<CYourClass> quando IClassFactory::CreateInstance é chamado. Durante a criação, o valor do desconhecido externo é verificado. Se for NULL, IUnknown é implementado para um objeto não agregado. Se o desconhecido externo não for NULL, IUnknown será implementado para um objeto agregado. |
A vantagem de usar CComAggObject e CComObject é que a implementação do IUnknown é otimizada para o tipo de objeto que está sendo criado. Por exemplo, um objeto não agregado precisa apenas de uma contagem de referência, enquanto um objeto agregado precisa de uma contagem de referência para o desconhecido interno e um ponteiro para o desconhecido externo.
A vantagem de usar CComPolyObject é que você evita ter ambos CComAggObject e CComObject em seu módulo para lidar com os casos agregados e não agregados. Um único CComPolyObject objeto lida com ambos os casos. Isso significa que apenas uma cópia do vtable e uma cópia das funções existem no seu módulo. Se o vtable for grande, isso pode diminuir substancialmente o tamanho do módulo. No entanto, se a sua tabela de métodos virtuais for pequena, utilizar CComPolyObject pode resultar num tamanho de módulo ligeiramente maior, uma vez que não está otimizada para um objeto agregado ou não agregado, ao contrário de CComAggObject e CComObject.
Ver também
Fundamentos de objetos ATL COM
Agregação e macros de fábrica de classes