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。 在调试生成中,返回可用于诊断或测试的值。

另请参阅

CComCachedTearOffObject 类
类概述