CComTearOffObject 类
此类实现分离式接口。
语法
template<class Base>
class CComTearOffObject : public Base
参数
Base
分离类,派生自 CComTearOffObjectBase
和希望分离对象支持的接口。
ATL 分两个阶段实现其分离式接口 - CComTearOffObjectBase
方法处理引用计数和 QueryInterface
,同时 CComTearOffObject
实现 IUnknown。
成员
公共构造函数
名称 | 描述 |
---|---|
CComTearOffObject::CComTearOffObject | 构造函数。 |
CComTearOffObject::~CComTearOffObject | 析构函数。 |
公共方法
名称 | 描述 |
---|---|
CComTearOffObject::AddRef | 递增 CComTearOffObject 对象的引用计数。 |
CComTearOffObject::QueryInterface | 返回指向分离类上或所有者类上请求接口的指针。 |
CComTearOffObject::Release | 递减 CComTearOffObject 对象的引用计数并销毁它。 |
CComTearOffObjectBase 方法
函数 | 说明 |
---|---|
CComTearOffObjectBase | 构造函数。 |
CComTearOffObjectBase 数据成员
数据成员 | 说明 |
---|---|
m_pOwner | 指向从所有者类派生的 CComObject 的指针。 |
注解
CComTearOffObject
将分离式接口实现为一个单独的对象,该对象仅在查询该接口时实例化。 当分离的引用计数变为零时,将删除该接口。 通常,你需要为很少使用的接口生成分离式接口,因为使用分离可将 vtable 指针保存主对象的所有实例中。
应从 CComTearOffObjectBase
以及希望分离式对象支持的任何接口派生实现分离的类。 CComTearOffObjectBase
在所有者类和线程模型上模板化。 所有者类是要为其实现分离的对象类。 如果未指定线程模型,将使用默认线程模型。
应为分离式类创建 COM 映射。 ATL 实例化分离式类时,将创建 CComTearOffObject<CYourTearOffClass>
或 CComCachedTearOffObject<CYourTearOffClass>
。
例如,在 BEEPER 示例中,CBeeper2
类是分离式类,CBeeper
类是所有者类:
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
要求
标头:atlcom.h
CComTearOffObject::AddRef
按 1 递增 CComTearOffObject
对象的引用计数。
STDMETHOD_(ULONG, AddRef)();
返回值
可用于诊断或测试的值。
CComTearOffObject::CComTearOffObject
构造函数。
CComTearOffObject(void* pv);
参数
pv
[in] 指针将转换为指向 CComObject<Owner>
对象的指针。
备注
按 1 递增所有者的引用计数。
CComTearOffObject::~CComTearOffObject
析构函数。
~CComTearOffObject();
注解
释放所有已分配的资源、调用 FinalRelease,并递减模块锁计数。
CComTearOffObject::CComTearOffObjectBase
构造函数。
CComTearOffObjectBase();
注解
将 m_pOwner 成员初始化为 NULL。
CComTearOffObject::m_pOwner
指针指向派生自所有者的 CComObject 对象。
CComObject<Owner>* m_pOwner;
参数
所有者
[in] 正在为此类实现分离。
备注
该指针在构造过程中初始化为 NULL。
CComTearOffObject::QueryInterface
检索指向所请求的接口的指针。
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
参数
iid
[in] 要请求的接口的 IID。
ppvObject
[out] 指向 iid 标识的接口指针的指针;如果未找到接口,则为 NULL。
返回值
标准 HRESULT 值。
备注
首先查询分离类上的接口。 如果接口不存在,则查询所有者对象的接口。 如果请求的接口为 IUnknown
,则返回所有者的 IUnknown
。
CComTearOffObject::Release
按 1 递减引用计数,如果引用计数为 0,则删除 CComTearOffObject
。
STDMETHOD_ULONG Release();
返回值
在非调试生成中,始终返回 0。 在调试生成中,返回可用于诊断或测试的值。