Partilhar via


Classe CComPolyObject

Essa classe implementa IUnknown para um objeto agregado ou não agregado.

Sintaxe

template<class contained>
class CComPolyObject : public IUnknown,
      public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>

Parâmetros

contained
Sua classe, derivada de CComObjectRoot ou CComObjectRootEx, bem como de qualquer outra interface que você deseja dar suporte no objeto.

Membros

Construtores públicos

Nome Descrição
CComPolyObject::CComPolyObject O construtor .
CComPolyObject::~CComPolyObject O destruidor.

Métodos públicos

Nome Descrição
CComPolyObject::AddRef Incrementa a contagem de referência do objeto.
CComPolyObject::CreateInstance (Estático) Permite que você crie um novo objeto CComPolyObject contained ><sem a sobrecarga de CoCreateInstance.
CComPolyObject::FinalConstruct Executa a inicialização final de m_contained.
CComPolyObject::FinalRelease Executa a destruição final de m_contained.
CComPolyObject::QueryInterface Recupera um ponteiro para a interface solicitada.
CComPolyObject::Release Diminui a contagem de referência do objeto.

Membros de Dados Públicos

Nome Descrição
CComPolyObject::m_contained Delega chamadas IUnknown para o desconhecido externo se o objeto for agregado ou para IUnknown do objeto se o objeto não for agregado.

Comentários

CComPolyObject implementa IUnknown para um objeto agregado ou não agregado.

Quando uma instância de CComPolyObject é criada, o valor do desconhecido externo é verificado. Se for NULL, IUnknown será 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 CComPolyObject é que você evita ter CComAggObject e CComObject em seu módulo para lidar com os casos agregados e não agregados. Um único objeto CComPolyObject manipula os dois casos. Isso significa que apenas uma cópia da vtable e uma cópia das funções existem em seu módulo. Se a vtable for grande, isso poderá diminuir substancialmente o tamanho do módulo. No entanto, se a vtable for pequena, usar CComPolyObject poderá resultar em um tamanho de módulo um pouco maior porque ele não é otimizado para um objeto agregado ou não agregado, como são CComAggObject e CComObject.

Se a macro DECLARE_POLY_AGGREGATABLE for especificada na definição de classe do objeto, CComPolyObject será usada para criar seu objeto. DECLARE_POLY_AGGREGATABLE será declarado automaticamente se você usar o Assistente de Projeto da ATL para criar um controle completo ou controle do Internet Explorer.

Se agregado, o objeto CComPolyObject tem seu próprio IUnknown, separado do objeto IUnknown externo, e mantém sua própria contagem de referência. CComPolyObject usa CComContainedObject para delegar ao desconhecido externo.

Para obter mais informações sobre agregação, confira o artigo Conceitos básicos de Objetos COM da ATL.

Hierarquia de herança

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

Requisitos

Cabeçalho: atlcom.h

CComPolyObject::AddRef

Incrementa a contagem de referência no objeto.

STDMETHOD_(ULONG, AddRef)();

Valor de retorno

Um valor que pode ser útil para diagnóstico ou teste.

CComPolyObject::CComPolyObject

O construtor .

CComPolyObject(void* pv);

Parâmetros

pv
[entrada] Um ponteiro para o desconhecido externo se o objeto deve ser agregado ou NULL se o objeto não for agregado.

Comentários

Inicializa o membro de dados CComContainedObject, m_contained, e incrementa a contagem de bloqueio do módulo.

O destruidor decrementa a contagem de bloqueio do módulo.

CComPolyObject::~CComPolyObject

O destruidor.

~CComPolyObject();

Comentários

Libera todos os recursos alocados, chama FinalRelease e decrementa a contagem de bloqueio do módulo.

CComPolyObject::CreateInstance

Permite que você crie um novo objeto CComPolyObjectcontained>< sem a sobrecarga de CoCreateInstance.

static HRESULT WINAPI CreateInstance(
    LPUNKNOWN pUnkOuter,
    CComPolyObject<contained>** pp);

Parâmetros

pp
[fora] Um ponteiro para um ponteiro CComPolyObject><contained. Se CreateInstance não for bem-sucedido, pp será definido como NULL.

Valor de retorno

Um valor HRESULT padrão.

Comentários

O objeto retornado tem uma contagem de referência igual a zero, portanto, chame AddRef imediatamente e use Release para liberar a referência no ponteiro do objeto quando terminar.

Se você não precisar de acesso direto ao objeto, mas ainda quiser criar um objeto sem a sobrecarga de CoCreateInstance, use CComCoClass::CreateInstance.

CComPolyObject::FinalConstruct

Chamado durante os estágios finais da construção do objeto, esse método executa qualquer inicialização final no membro de dadosm_contained.

HRESULT FinalConstruct();

Valor de retorno

Um valor HRESULT padrão.

CComPolyObject::FinalRelease

Chamado durante a destruição de objetos, esse método libera o membro de dadosm_contained.

void FinalRelease();

CComPolyObject::m_contained

Um objeto CComContainedObject derivado de sua classe.

CComContainedObject<contained> m_contained;

Parâmetros

contained
[entrada] Sua classe, derivada de CComObjectRoot ou CComObjectRootEx, bem como de qualquer outra interface que você deseja dar suporte no objeto.

Comentários

IUnknown chamadas através de m_contained são delegadas para o desconhecido externo se o objeto for agregado ou para o IUnknown desse objeto se o objeto não for agregado.

CComPolyObject::QueryInterface

Recupera um ponteiro para a interface solicitada.

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
template <class Q>
HRESULT QueryInterface(Q** pp);

Parâmetros

Q
A interface COM.

iid
[in] O identificador da interface sendo solicitada.

ppvObject
[out] Um ponteiro para o ponteiro da interface identificado por iid. Se o objeto não der suporte a essa interface, o ppvObject será definido como NULL.

pp
[saída] Um ponteiro para a interface identificada por __uuidof(Q).

Valor de retorno

Um valor HRESULT padrão.

Comentários

Para um objeto agregado, se a interface solicitada for IUnknown, QueryInterface retornará um ponteiro para o próprio IUnknown do objeto agregado e incrementará a contagem de referência. Caso contrário, esse método consultará a interface por meio do membro de dados CComContainedObject, o m_contained.

CComPolyObject::Release

Diminui a contagem de referência no objeto.

STDMETHOD_(ULONG, Release)();

Valor de retorno

Em builds de depuração, Release retorna um valor que pode ser útil para diagnóstico ou teste. Em compilações sem depuração, o Release sempre retorna 0.

Confira também

Classe CComObjectRootEx
DECLARE_POLY_AGGREGATABLE
Visão geral da aula