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
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