Implementando CComObject, CComAggObject, e CComPolyObject
O modelo classe CComObject, CComAggObject, e CComPolyObject sempre é a maioria das classes derivadas na cadeia de herança.É de sua responsabilidade manipular todos os métodos em IUnknown: QueryInterface, AddRef, e Versão.Além de isso, CComAggObject e CComPolyObject (quando usado para objetos agregados) fornecem contagem de referência e semântica especiais de QueryInterface necessárias para o desconhecido interno.
Se CComObject, CComAggObject, ou CComPolyObject são usados depende se você não declarar um (ou qualquer macros) dos seguintes:
Macro |
Efeito |
---|---|
DECLARE_NOT_AGGREGATABLE |
Sempre use CComObject. |
DECLARE_AGGREGATABLE |
Usa CComAggObject se o objeto é agregado e CComObject se não é.CComCoClass contém esse macro se nenhum dos macros de DECLARE_*_AGGREGATABLE são declarados em sua classe, isso será o padrão. |
DECLARE_ONLY_AGGREGATABLE |
Sempre use CComAggObject.Retorna um erro se o objeto não é agregado. |
DECLARE_POLY_AGGREGATABLE |
ATL cria uma instância de CComPolyObject<CYourClass> quando IClassFactory::CreateInstance é chamado.Durante a criação, o valor de desconhecido externo é verificado.Se é NULO, IUnknown é implementado para um objeto nonaggregated.Se o não externo não é NULO, IUnknown é implementado para um objeto agregado. |
A vantagem de usar CComAggObject e CComObject é a implementação de IUnknown é otimizado para o tipo de objeto que está sendo criado.Por exemplo, um objeto nonaggregated precisa apenas uma contagem de referência, quando um objeto agregado necessário 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 CComAggObject e CComObject em seu módulo para manipular o caso agregados e nonaggregated.Identificadores únicos de objeto de CComPolyObject ambos os casos.Isso significa que apenas uma cópia de vtable e uma cópia das funções existem no seu módulo.Se seu vtable é grande, isso pode reduzir significativamente o tamanho do módulo.Em o entanto, se seu vtable é pequeno, usar CComPolyObject pode resultar em um tamanho maior um pouco de módulo porque não é otimizado para um objeto agregado ou nonaggregated, como é CComAggObject e CComObject.
Consulte também
Referência
Fundamentos de objetos COM de ATL