Classe CComObjectRootEx
Essa classe fornece métodos para manipular o gerenciamento de contagem de referência de objetos para objetos nonaggregated e agregados.
template<
class ThreadModel
>
class CComObjectRootEx : public CComObjectRootBase
Parâmetros
- ThreadModel
A classe cujos métodos implementam o modelo de threading desejado.Você pode explicitamente escolher o modelo de threading, configuração ThreadModel para CComSingleThreadModel, CComMultiThreadModel, or CComMultiThreadModelNoCS.Você pode aceitar o modelo de segmento padrão do servidor definindo ThreadModel para CComObjectThreadModel or CComGlobalsThreadModel.
Comentários
CComObjectRootEx lida com gerenciamento de contagem de referência de objetos para objetos nonaggregated e agregados. Ele armazena a contagem de referência de objeto se o objeto não está sendo agregado e mantém o ponteiro para desconhecido externo se seu objeto está sendo agregado.Para objetos agregados, CComObjectRootEx métodos podem ser usados para manipular a falha do objeto interno para construir e proteger o objeto externo da exclusão quando interfaces internas são liberados ou o objeto interno é excluído.
Uma classe que implementa um servidor COM deve herdar da CComObjectRootEx ou CComObjectRoot.
Se sua definição de classe especifica o DECLARE_POLY_AGGREGATABLE macro, o 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.
Se sua classe não especificar o DECLARE_POLY_AGGREGATABLE macro, o ATL cria uma instância de CAggComObject <cyourclass> para objetos agregados ou uma instância de CComObject <cyourclass> nonaggregated objetos.
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. Portanto, 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.
Se o objeto é agregado, IUnknown é implementada por CComAggObject ou CComPolyObject. Essas classes delegado QueryInterface, AddRef, e Versão calls to CComObjectRootEx's OuterQueryInterface, OuterAddRef, e OuterRelease para encaminhar a externo desconhecido. Normalmente, substituir CComObjectRootEx::FinalConstruct na sua classe para criar todos os objetos agregados e substituir CComObjectRootEx::FinalRelease Para liberar todos os objetos agregados.
Se o objeto não está agregado, IUnknown é implementada por CComObject ou CComPolyObject. Nesse caso, chamadas de QueryInterface, AddRef, e Versão delegadas para CComObjectRootEx's InternalQueryInterface, InternalAddRef, e InternalRelease para executar as operações real.
Requisitos
Cabeçalho: atlcom.h