CComEnum 类
此类基于数组定义 COM 枚举器对象。
语法
template <class Base,
const IID* piid, class T, class Copy, class ThreadModel = CcomObjectThreadModel>
class ATL_NO_VTABLE CComEnum : public CComEnumImpl<Base, piid,
T,
Copy>,
public CComObjectRootEx<ThreadModel>
参数
Base
COM 枚举器接口。 有关示例,请参阅 IEnumString。
piid
指向枚举器接口的接口 ID 的指针。
T
枚举器接口公开的项的类型。
复制
同质复制策略类。
ThreadModel
类的线程模型。 此参数默认为在项目中使用的全局对象线程模型。
备注
CComEnum
基于数组定义 COM 枚举器对象。 此类类似于 CComEnumOnSTL,它基于 C++ 标准库容器实现枚举器。 下面概述了使用此类的典型步骤。 有关详细信息,请参阅 ATL 集合和枚举器。
使用此类:
typedef
此类的专用化。使用
typedef
作为CComObject
专用化中的模板参数。创建
CComObject
专用化的实例。通过调用 CComEnumImpl::Init 来初始化枚举器对象。
将枚举器接口返回到客户端。
继承层次结构
CComObjectRootBase
Base
CComEnum
要求
标头:atlcom.h
示例
以下所示代码提供了一个可重用的函数,可用于创建和初始化枚举器对象。
template <class EnumType, class ElementType>
HRESULT CreateEnumerator(IUnknown** ppUnk, ElementType* begin, ElementType* end,
IUnknown* pUnk, CComEnumFlags flags)
{
if (ppUnk == NULL)
return E_POINTER;
*ppUnk = NULL;
CComObject<EnumType>* pEnum = NULL;
HRESULT hr = CComObject<EnumType>::CreateInstance(&pEnum);
if (FAILED(hr))
return hr;
hr = pEnum->Init(begin, end, pUnk, flags);
if (SUCCEEDED(hr))
hr = pEnum->QueryInterface(ppUnk);
if (FAILED(hr))
delete pEnum;
return hr;
} // CreateEnumerator
该函数模板可用于实现集合接口的 _NewEnum
属性,如下所示:
typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > VarArrEnum;
class ATL_NO_VTABLE CVariantArrayCollection :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CVariantArrayCollection, &CLSID_VariantArrayCollection>,
public IDispatchImpl<IVariantArrayCollection, &IID_IVariantArrayCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
VARIANT m_arr[3];
public:
STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
{
return CreateEnumerator<VarArrEnum>(ppUnk, &m_arr[0], &m_arr[3], this,
AtlFlagNoCopy);
}
// Remainder of class declaration omitted.
此代码为 CComEnum
创建一个 typedef
,后者通过 IEnumVariant
接口公开一个 VARIANT 的向量。 CVariantArrayCollection
类只是专门化 CreateEnumerator
来处理这种类型的枚举器对象并传递必要的参数。