CComPolyObject 类

此类为聚合或非聚合对象实现 IUnknown

语法

template<class contained>
class CComPolyObject : public IUnknown,
      public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>

参数

contained
类派生自 CComObjectRootCComObjectRootEx,以及对象上你要支持的任何其他接口。

成员

公共构造函数

名称 描述
CComPolyObject::CComPolyObject 构造函数。
CComPolyObject::~CComPolyObject 析构函数。

公共方法

名称 描述
CComPolyObject::AddRef 递增对象的引用计数。
CComPolyObject::CreateInstance (静态)允许你创建新的 CComPolyObject<contained> 对象而没有 CoCreateInstance 开销。
CComPolyObject::FinalConstruct m_contained 执行最终的初始化。
CComPolyObject::FinalRelease m_contained 执行最终的析构。
CComPolyObject::QueryInterface 检索指向所请求的接口的指针。
CComPolyObject::Release 递减对象的引用计数。

公共数据成员

“属性” 描述
CComPolyObject::m_contained 如果对象已聚合,则将 IUnknown 调用委托给外部未知;如果对象未聚合,则委托给对象的 IUnknown

注解

CComPolyObject 为聚合或非聚合对象实现 IUnknown

创建 CComPolyObject 的实例时,将检查外部未知的值。 如果为 NULL,则 IUnknown 为非聚合对象实现。 如果外部未知不为 NULL,则会为聚合对象实现 IUnknown

使用 CComPolyObject 的优点是,避免在模块中同时使用 CComAggObjectCComObject 处理聚合和非聚合事例。 单个 CComPolyObject 对象处理这两种情况。 这意味着模块中只有一个 vtable 副本和一个函数副本。 如果 vtable 很大,这可以大大减小模块大小。 但是,如果 vtable 较小,则使用 CComPolyObject 可能会导致模块大小略大,因为它未针对聚合或非聚合对象进行优化,如 CComAggObjectCComObject 所示。

如果在对象的类定义中指定了 DECLARE_POLY_AGGREGATABLE 宏,则将使用 CComPolyObject 来创建对象。 如果使用 ATL 项目向导创建完全控件或 Internet Explorer 控件,则会自动声明 DECLARE_POLY_AGGREGATABLE。

如果已聚合,则 CComPolyObject 对象有其自己的 IUnknown(独立于外部对象的 IUnknown),并保留其自己的引用计数。 CComPolyObject 使用 CComContainedObject 来委托给外部未知。

有关聚合的详细信息,请参阅 ATL COM 对象的基础知识一文。

继承层次结构

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

要求

标头:atlcom.h

CComPolyObject::AddRef

递增对象的引用计数。

STDMETHOD_(ULONG, AddRef)();

返回值

可用于诊断或测试的值。

CComPolyObject::CComPolyObject

构造函数。

CComPolyObject(void* pv);

参数

pv
[in] 如果要聚合对象,则为指向外部未知的指针;如果对象未聚合,则为 NULL。

备注

初始化 CComContainedObject 数据成员 m_contained,并递增模块锁计数。

析构函数递减模块锁计数。

CComPolyObject::~CComPolyObject

析构函数。

~CComPolyObject();

注解

释放所有已分配的资源、调用 FinalRelease,并递减模块锁计数。

CComPolyObject::CreateInstance

允许你创建新的 CComPolyObject<contained> 对象而没有 CoCreateInstance 开销。

static HRESULT WINAPI CreateInstance(
    LPUNKNOWN pUnkOuter,
    CComPolyObject<contained>** pp);

参数

pp
[out] 指向 CComPolyObject<contained> 指针的指针。 如果 CreateInstance 不成功,则会将 pp 设置为 NULL。

返回值

标准 HRESULT 值。

备注

返回的对象的引用计数为零,因此请立即调用 AddRef,然后在完成后使用 Release 释放对象指针上的引用。

如果不需要直接访问对象,但仍希望创建一个新对象而没有 CoCreateInstance 开销,请改用 CComCoClass::CreateInstance

CComPolyObject::FinalConstruct

在对象构造的最后阶段调用,此方法对 m_contained 数据成员执行任何最终初始化。

HRESULT FinalConstruct();

返回值

标准 HRESULT 值。

CComPolyObject::FinalRelease

在对象析构期间调用,此方法释放 m_contained 数据成员。

void FinalRelease();

CComPolyObject::m_contained

从类派生的 CComContainedObject 对象。

CComContainedObject<contained> m_contained;

参数

contained
[in] 类派生自 CComObjectRootCComObjectRootEx,以及对象上你要支持的任何其他接口。

备注

如果对象已聚合,则通过 m_contained 进行的 IUnknown 调用将委托给外部未知;如果对象未聚合,则委托给对象的 IUnknown

CComPolyObject::QueryInterface

检索指向所请求的接口的指针。

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
template <class Q>
HRESULT QueryInterface(Q** pp);

参数

Q
COM 接口。

iid
[in] 请求的接口的标识符。

ppvObject
[out] 一个指向 iid 所标识的接口指针的指针。 如果对象不支持此接口,则 ppvObject 设置为 NULL。

pp
[out] 一个指向 __uuidof(Q) 所标识的接口的指针。

返回值

标准 HRESULT 值。

注解

对于已聚合对象,如果请求的接口为 IUnknown,则 QueryInterface 会返回指向已聚合对象自己的 IUnknown 的指针,并递增引用计数。 否则,此方法会通过 CComContainedObject 数据成员 m_contained 来查询接口。

CComPolyObject::Release

递减对象的引用计数。

STDMETHOD_(ULONG, Release)();

返回值

在调试生成中,Release 返回可用于诊断或测试的值。 在非调试生成中,Release 始终返回 0。

另请参阅

CComObjectRootEx 类
DECLARE_POLY_AGGREGATABLE
类概述