CComPolyObject 类
此类为聚合或非聚合对象实现 IUnknown
。
语法
template<class contained>
class CComPolyObject : public IUnknown,
public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>
参数
contained
类派生自 CComObjectRoot 或 CComObjectRootEx,以及对象上你要支持的任何其他接口。
成员
公共构造函数
名称 | 描述 |
---|---|
CComPolyObject::CComPolyObject | 构造函数。 |
CComPolyObject::~CComPolyObject | 析构函数。 |
公共方法
名称 | 描述 |
---|---|
CComPolyObject::AddRef | 递增对象的引用计数。 |
CComPolyObject::CreateInstance | (静态)允许在不产生 CoCreateInstance 开销的情况下创建新的 CComPolyObject contained ><对象。 |
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
的优点是,避免在模块中同时使用 CComAggObject 和 CComObject 处理聚合和非聚合事例。 单个 CComPolyObject
对象处理这两种情况。 这意味着模块中只有一个 vtable 副本和一个函数副本。 如果 vtable 很大,这可以大大减小模块大小。 但是,如果 vtable 较小,则使用 CComPolyObject
可能会导致模块大小略大,因为它未针对聚合或非聚合对象进行优化,如 CComAggObject
和 CComObject
所示。
如果在对象的类定义中指定了 DECLARE_POLY_AGGREGATABLE 宏,则将使用 CComPolyObject
来创建对象。 如果使用 ATL 项目向导创建完全控件或 Internet Explorer 控件,则会自动声明 DECLARE_POLY_AGGREGATABLE。
如果已聚合,则 CComPolyObject
对象有其自己的 IUnknown
(独立于外部对象的 IUnknown
),并保留其自己的引用计数。 CComPolyObject
使用 CComContainedObject 来委托给外部未知。
有关聚合的详细信息,请参阅 ATL COM 对象的基础知识一文。
继承层次结构
CComObjectRootBase
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
允许在不产生 CoCreateInstance 开销的情况下创建新的 CComPolyObjectcontained
>< 对象。
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] 类派生自 CComObjectRoot 或 CComObjectRootEx,以及对象上你要支持的任何其他接口。
备注
如果对象已聚合,则通过 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。