Clase CComTearOffObject
Esta clase implementa una interfaz desplazable.
template<class Base>
class CComTearOffObject : public Base
Base
La clase desplazable, derivada de CComTearOffObjectBase
y las interfaces que quiera que admita el objeto desplazado.
ATL implementa las interfaces desplazables en dos fases: los métodos CComTearOffObjectBase
controlan el recuento de referencias y QueryInterface
, mientras CComTearOffObject
implementa IUnknown.
Nombre | Descripción |
---|---|
CComTearOffObject::CComTearOffObject | Constructor . |
CComTearOffObject::~CComTearOffObject | El destructor . |
Nombre | Descripción |
---|---|
CComTearOffObject::AddRef | Incrementa el recuento de referencias de un objeto CComTearOffObject . |
CComTearOffObject::QueryInterface | Devuelve un puntero a la interfaz solicitada en la clase desplazable o en la clase de propietario. |
CComTearOffObject::Release | Disminuye el recuento de referencias de un objeto CComTearOffObject y lo destruye. |
Función | Descripción |
---|---|
CComTearOffObjectBase | Constructor. |
Miembro de datos | Descripción |
---|---|
m_pOwner | Puntero a un CComObject derivado de la clase de propietario. |
CComTearOffObject
implementa una interfaz desplazable como un objeto independiente al que solo se crea una instancia cuando se consulta esa interfaz. El desplazamiento se elimina cuando el recuento de referencias se convierte en cero. Normalmente, se crea una interfaz desplazable para una interfaz que rara vez se usa, ya que el uso de una desplazable guarda un puntero vtable en todas las instancias del objeto principal.
Debe derivar la clase que implementa el desplazable de CComTearOffObjectBase
y de las interfaces que quiera que admita el objeto desplazado. CComTearOffObjectBase
usa plantillas en la clase de propietario y en el modelo de subproceso. La clase de propietario es la clase del objeto para el que se implementa un desplazamiento. Si no especifica un modelo de subproceso, se usará el modelo de subproceso predeterminado.
Debe crear un mapa COM para la clase desplazable. Cuando ATL crea una instancia desplazable, creará CComTearOffObject<CYourTearOffClass>
o CComCachedTearOffObject<CYourTearOffClass>
.
Por ejemplo, en el ejemplo BEEPER, la clase CBeeper2
es la clase desplazable y la clase CBeeper
es la clase de propietario:
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:
};
Base
CComTearOffObject
Encabezado: atlcom.h
Incrementa en uno el recuento de referencias del objeto CComTearOffObject
.
STDMETHOD_(ULONG, AddRef)();
Valor que puede ser útil para los diagnósticos y las pruebas.
Constructor .
CComTearOffObject(void* pv);
pv
[in] Puntero que se convertirá en un puntero a un objeto CComObject<Owner>
.
Incrementa en uno el recuento de referencias del propietario.
El destructor .
~CComTearOffObject();
Libera todos los recursos asignados, llama a FinalRelease y disminuye el número de bloqueos del módulo.
Constructor .
CComTearOffObjectBase();
Inicializa el miembro m_pOwner a NULL.
Puntero a un objeto CComObject derivado de Propietario.
CComObject<Owner>* m_pOwner;
Propietario
[in] Clase para la que se implementa un desplazamiento.
El puntero se inicializa en NULL durante la construcción.
Recupera un puntero a la interfaz solicitada.
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
iid
[in] IID de la interfaz solicitada.
ppvObject
[out] Puntero al puntero de interfaz identificado por iid o NULL si la interfaz no se encuentra.
Valor HRESULT estándar.
Primero consulta las interfaces de la clase desplazable. Si la interfaz no se encuentra, consulte la interfaz en el objeto del propietario. Si la interfaz que se solicita es IUnknown
, devuelve el IUnknown
del propietario.
Disminuye el recuento de referencias en uno y, si el recuento de referencias es cero, elimina CComTearOffObject
.
STDMETHOD_ULONG Release();
En compilaciones que no son de depuración, siempre devuelve cero. En las compilaciones de depuración, devuelve un valor que puede ser útil para los diagnósticos o las pruebas.
CComCachedTearOffObject (clase)
Información general sobre la clase