Partilhar via


Classe CComPolyObject

Observação

A Active Template Library (ATL) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Esta classe implementa-se IUnknown para um objeto agregado ou não agregado.

Sintaxe

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

Parâmetros

contido
A sua classe, derivada de CComObjectRoot ou CComObjectRootEx, bem como de quaisquer outras interfaces que queira suportar no objeto.

Membros

Construtores Públicos

Nome Description
CComPolyObject::CComPolyObject O construtor.
CComPolyObject::~CComPolyObject O destruidor.

Métodos Públicos

Nome Description
CComPolyObject::AddRef Incrementa a contagem de referências do objeto.
CComPolyObject::CreateInstance (Estática) Permite criar um novo objeto CComPolyObject<contained> sem a sobrecarga do CoCreateInstance.
CComPolyObject::FinalConstruct Realiza a inicialização final de m_contained.
CComPolyObject::FinalRelease Realiza a destruição final de m_contained.
CComPolyObject::QueryInterface Recupera um ponteiro para a interface solicitada.
CComPolyObject::Release Diminui a contagem de referências do objeto.

Membros de Dados Públicos

Nome Description
CComPolyObject::m_contained Os delegados IUnknown chamam para o desconhecido exterior se o objeto estiver agregado ou para o IUnknown do objeto se o objeto não for agregado.

Observações

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

Quando uma instância de CComPolyObject é criada, verifica-se o valor do desconhecido exterior. Se for NULL, IUnknown é implementado para um objeto não agregado. Se o desconhecido exterior não for NULL, IUnknown é implementado para um objeto agregado.

A vantagem de usar CComPolyObject é que evita ter tanto CComAggObject como CComObject no seu módulo para lidar com os casos agregados e não agregados. Um único CComPolyObject objeto trata ambos os casos. Isto significa que só existem uma cópia da vtable e uma cópia das funções no seu módulo. Se a sua vtable for grande, isso pode diminuir substancialmente o tamanho do seu módulo. No entanto, se a sua vtable for pequena, a utilização CComPolyObject pode resultar num tamanho ligeiramente maior do módulo porque não está otimizada para um objeto agregado ou não agregado, tal como são CComAggObject e CComObject.

Se o macro DECLARE_POLY_AGGREGATABLE estiver especificado na definição da classe do seu objeto, CComPolyObject será usado para criar o seu objeto. DECLARE_POLY_AGGREGATABLE será automaticamente declarado se usar o Assistente de Projeto ATL para criar um controlo total ou controlo do Internet Explorer.

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

Para mais informações sobre agregação, consulte o artigo Fundamentos dos Objetos COM ATL.

Hierarquia de herança

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

Requerimentos

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ósticos ou testes.

CComPolyObject::CComPolyObject

O construtor.

CComPolyObject(void* pv);

Parâmetros

PV
[dentro] Um ponteiro para o desconhecido exterior se o objeto for agregado, ou NULL se o objeto não for agregado.

Observações

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

O destruidor diminui a contagem de bloqueios do módulo.

CComPolyObject::~CComPolyObject

O destruidor.

~CComPolyObject();

Observações

Liberta todos os recursos alocados, chama o FinalRelease e diminui a contagem de bloqueios de módulos.

CComPolyObject::CreateInstance

Permite criar um novo objeto CComPolyObject<contained> sem a sobrecarga do 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 é definido como NULL.

Valor de retorno

Um valor HRESULT padrão.

Observações

O objeto devolvido tem uma contagem de referência zero, por isso chama AddRef imediatamente e depois usa Release para libertar a referência no ponteiro do objeto quando terminares.

Se não precisares de acesso direto ao objeto, mas ainda assim quiseres criar um novo objeto sem a sobrecarga de CoCreateInstance, usa CComCoClass::CreateInstance em vez disso.

CComPolyObject::FinalConstruct

Chamado durante as fases finais da construção do objeto, este método realiza qualquer inicialização final no m_contained elemento de dados.

HRESULT FinalConstruct();

Valor de retorno

Um valor HRESULT padrão.

CComPolyObject::FinalRelease

Chamado durante a destruição de objetos, este método liberta o m_contained elemento de dados.

void FinalRelease();

CComPolyObject::m_contained

Um objeto CComContainedObject derivado da tua classe.

CComContainedObject<contained> m_contained;

Parâmetros

contido
[dentro] A sua classe, derivada de CComObjectRoot ou CComObjectRootEx, bem como de quaisquer outras interfaces que queira suportar no objeto.

Observações

IUnknown chamadas através m_contained são atribuídas ao desconhecido exterior se o objeto for agregado, ou ao IUnknown de este 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
[dentro] O identificador da interface a ser solicitada.

ppvObject
[fora] Um apontador para o ponteiro de interface identificado por iid. Se o objeto não suportar esta interface, o ppvObject é definido como NULL.

pp
[fora] Um ponteiro para a interface identificada por __uuidof(Q).

Valor de retorno

Um valor HRESULT padrão.

Observações

Para um objeto agregado, se a interface solicitada for IUnknown, QueryInterface devolve um ponteiro ao objeto agregado IUnknown e incrementa a contagem de referências. Caso contrário, este método consulta a interface através do CComContainedObject membro de dados, m_contained.

CComPolyObject::Release

Diminui a contagem de referência no objeto.

STDMETHOD_(ULONG, Release)();

Valor de retorno

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

Consulte também

Classe CComObjectRootEx
DECLARE_POLY_AGGREGATABLE
Visão geral da classe