Partilhar via


Classe CComTearOffObject

Essa classe implementa uma interface destacável.

Sintaxe

template<class Base>
class CComTearOffObject : public Base

Parâmetros

Base
Sua classe destacável, derivada de CComTearOffObjectBase e as interfaces às quais você deseja que o seu objeto destacável dê suporte.

A ATL implementa suas interfaces destacáveis em duas fases: os métodos CComTearOffObjectBase lidam com a contagem de referência e QueryInterface, enquanto CComTearOffObject implementa IUnknown.

Membros

Construtores públicos

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

Métodos públicos

Nome Descrição
CComTearOffObject::AddRef Incrementa a contagem de referência de um objeto CComTearOffObject.
CComTearOffObject::QueryInterface Retorna um ponteiro para a interface solicitada na classe destacável ou na classe de proprietário.
CComTearOffObject::Release Decrementa a contagem de referência de um objeto CComTearOffObject e o destrói.

Métodos CComTearOffObjectBase

Função Descrição
CComTearOffObjectBase Construtor.

Membros de dados CComTearOffObjectBase

Membro de dados Descrição
m_pOwner Um ponteiro para um CComObject derivado da classe de proprietário.

Comentários

CComTearOffObject implementa uma interface destacável como um objeto separado que é instanciado somente quando essa interface é consultada. O elemento destacável é excluído quando sua contagem de referência se torna zero. Normalmente, você cria uma interface destacável para uma interface que raramente é usada, já que o uso de um elemento destacável salva um ponteiro vtable em todas as instâncias do objeto principal.

Você deve derivar a classe que implementa o elemento destacável de CComTearOffObjectBase e de qualquer interface à qual você deseja que seu objeto destacável dê suporte. CComTearOffObjectBase é templatizado na classe de proprietário e no modelo de thread. A classe de proprietário é a classe do objeto para o qual um elemento destacável está sendo implementado. Se você não especificar um modelo de thread, o modelo de thread padrão será usado.

Você deve criar um mapa COM para sua classe destacável. Quando a ATL instanciar o elemento destacável, ela criará CComTearOffObject<CYourTearOffClass> ou CComCachedTearOffObject<CYourTearOffClass>.

Por exemplo, no exemplo de BEEPER, a classe CBeeper2 é a destacável e a classe CBeeper é a de proprietário:

class CBeeper2 :
   public ISupportErrorInfo,
   public CComTearOffObjectBase<CBeeper>
{
public:
   CBeeper2() {}
   STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
   {
      return (InlineIsEqualGUID(IID_IBeeper, riid)) ? S_OK : S_FALSE;
   }

BEGIN_COM_MAP(CBeeper2)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
};

class ATL_NO_VTABLE CBeeper :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CBeeper, &CLSID_Beeper>,
   public IDispatchImpl<IBeeper, &IID_IBeeper, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   CBeeper()
   {
   }

DECLARE_REGISTRY_RESOURCEID(IDR_BEEPER)

DECLARE_NOT_AGGREGATABLE(CBeeper)

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

// ISupportsErrorInfo
   STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);


   DECLARE_PROTECT_FINAL_CONSTRUCT()

   HRESULT FinalConstruct()
   {
      return S_OK;
   }

   void FinalRelease()
   {
   }

public:

};

Hierarquia de herança

Base

CComTearOffObject

Requisitos

Cabeçalho: atlcom.h

CComTearOffObject::AddRef

Incrementa a contagem de referência do objeto CComTearOffObject em um.

STDMETHOD_(ULONG, AddRef)();

Valor de retorno

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

CComTearOffObject::CComTearOffObject

O construtor .

CComTearOffObject(void* pv);

Parâmetros

pv
[in] Ponteiro que será convertido em um ponteiro para um objeto CComObject<Owner>.

Comentários

Incrementa a contagem de referência do proprietário em um.

CComTearOffObject::~CComTearOffObject

O destruidor.

~CComTearOffObject();

Comentários

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

CComTearOffObject::CComTearOffObjectBase

O construtor .

CComTearOffObjectBase();

Comentários

Inicializa o membro m_pOwner em NULL.

CComTearOffObject::m_pOwner

Um ponteiro para um objeto CComObject derivado de Owner.

CComObject<Owner>* m_pOwner;

Parâmetros

Proprietário
[in] A classe para a qual um elemento destacável está sendo implementado.

Comentários

O ponteiro é inicializado em NULL durante a construção.

CComTearOffObject::QueryInterface

Recupera um ponteiro para a interface solicitada.

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);

Parâmetros

iid
[in] O IID da interface que está sendo solicitado.

ppvObject
[out] Um ponteiro para o ponteiro de interface identificado por iid ou NULL se a interface não for encontrada.

Valor de retorno

Um valor HRESULT padrão.

Comentários

Consulta primeiro as interfaces na sua classe destacável. Se a interface não estiver lá, consulta a interface no objeto do proprietário. Se a interface solicitada for IUnknown, retornará o IUnknown do proprietário.

CComTearOffObject::Release

Decrementa a contagem de referência em um e, se ela for zero, exclui o CComTearOffObject.

STDMETHOD_ULONG Release();

Valor de retorno

Em builds que não são de depuração, sempre retorna 0. Em builds de depuração, retorna um valor que pode ser útil para diagnóstico ou teste.

Confira também

Classe CComCachedTearOffObject
Visão geral da aula