Partilhar via


Classe CComTearOffObject

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 uma interface de desligamento.

Sintaxe

template<class Base>
class CComTearOffObject : public Base

Parâmetros

Base
A sua classe de remoção derivada e CComTearOffObjectBase as interfaces que quer que o seu objeto de remoção suporte.

O ATL implementa as suas interfaces de separação em duas fases — os CComTearOffObjectBase métodos tratam a contagem de referências e QueryInterface, enquanto CComTearOffObject implementa IUnknown.

Membros

Construtores Públicos

Nome Description
CComTearOffObject::CComTearTearOffObject O construtor.
CComTearOffObject::~CComTearOffObject O destruidor.

Métodos Públicos

Nome Description
CComTearOffObject::AddRef Incrementa a contagem de referência para um CComTearOffObject objeto.
CComTearOffObject::QueryInterface Devolve um ponteiro para a interface solicitada, seja na sua classe de remoção ou na classe proprietária.
CComTearOffObject::Release Diminui a contagem de referência de um CComTearOffObject objeto e destrói-o.

Métodos CComTearOffObjectBase

Função Description
CComTearOffObjectBase Construtor.

Membros de dados CComTearOffObjectBase

Membro de dados Description
m_pOwner Um indicador para um CComObject derivado da classe proprietário.

Observações

CComTearOffObject implementa uma interface de remoção como um objeto separado que só é instanciado quando essa interface é consultada. A desmontagem é eliminada quando a sua contagem de referências se torna zero. Normalmente, constróis uma interface de remoção para uma interface que raramente é usada, já que usar uma remoção guarda um ponteiro vtable em todas as instâncias do teu objeto principal.

Deves derivar a classe que implementa o tear-off a partir CComTearOffObjectBase e a partir das interfaces que queres que o teu objeto de remoção suporte. CComTearOffObjectBase está templatizado na classe proprietário e no modelo de rosca. A classe proprietário é a classe do objeto para a qual está a ser implementada uma remoção. Se não especificar um modelo de thread, é usado o modelo de thread padrão.

Deves criar um mapa COM para a tua turma de desmontagem. Quando o ATL instancia o tear-off, irá criar CComTearOffObject<CYourTearOffClass> ou CComCachedTearOffObject<CYourTearOffClass>.

Por exemplo, na amostra BEEPER, a CBeeper2 classe é a classe de remoção e a CBeeper classe é a classe proprietária:

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

Requerimentos

Cabeçalho: atlcom.h

CComTearOffObject::AddRef

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

STDMETHOD_(ULONG, AddRef)();

Valor de retorno

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

CComTearOffObject::CComTearTearOffObject

O construtor.

CComTearOffObject(void* pv);

Parâmetros

PV
[dentro] Ponteiro que será convertido num ponteiro para um CComObject<Owner> objeto.

Observações

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

CComTearOffObject::~CComTearOffObject

O destruidor.

~CComTearOffObject();

Observações

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

CComTearOffObject::CComTearOffObjectBase

O construtor.

CComTearOffObjectBase();

Observações

Inicializa o membro m_pOwner em NULL.

CComTearOffObject::m_pOwner

Um apontador para um objeto CComObject derivado de Owner.

CComObject<Owner>* m_pOwner;

Parâmetros

Proprietário
[dentro] A classe para a qual está a ser implementada uma desmontagem.

Observações

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

CComTearOffObject::QueryInterface

Recupera um ponteiro para a interface solicitada.

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

Parâmetros

IID
[dentro] O IID da interface a ser solicitado.

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

Valor de retorno

Um valor HRESULT padrão.

Observações

Consultas primeiro para interfaces na tua turma de desmontagem. Se a interface não estiver lá, consulta a interface no objeto proprietário. Se a interface solicitada for IUnknown, devolve o IUnknown do proprietário.

CComTearOffObject::Release

Diminui a contagem de referência em um e, se a contagem for zero, elimina o CComTearOffObject.

STDMETHOD_ULONG Release();

Valor de retorno

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

Consulte também

Classe CComCachedTearOffObject
Visão geral da classe