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.