CComEnumOnSTL 类

此类定义基于 C++ 标准库集合的 COM 枚举器对象。

语法

template <class Base,
    const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
class ATL_NO_VTABLE CComEnumOnSTL : public IEnumOnSTLImpl<Base, piid,
T,
    Copy,
CollType>,
    public CComObjectRootEx<ThreadModel>

参数

Base
COM 枚举器。 有关示例,请参阅 IEnumString

piid
指向枚举器接口的接口 ID 的指针。

T
枚举器接口公开的项的类型。

复制
复制策略类

CollType
C++ 标准库容器类。

备注

CComEnumOnSTL 定义基于 C++ 标准库集合的 COM 枚举器对象。 此类可以单独使用或与 ICollectionOnSTLImpl 结合使用。 下面概述了使用此类的典型步骤。 有关详细信息,请参阅 ATL 集合和枚举器

要将此类与 ICollectionOnSTLImpl 一起使用:

  • typedef 此类的专用化。

  • 使用 typedef 作为 ICollectionOnSTLImpl 专用化中的最终模板参数。

有关示例,请参阅 ATL 集合和枚举器

要独立于 ICollectionOnSTLImpl 使用此类:

  • typedef 此类的专用化。

  • 使用 typedef 作为 CComObject 专用化中的模板参数。

  • 创建 CComObject 专用化的实例。

  • 通过调用 IEnumOnSTLImpl::Init 枚举器初始化枚举器对象。

  • 将枚举器接口返回到客户端。

继承层次结构

CComObjectRootBase

Base

CComObjectRootEx

IEnumOnSTLImpl

CComEnumOnSTL

要求

标头:atlcom.h

示例

下面显示的代码提供了一个通用函数来处理枚举器对象的创建和初始化:

template <class EnumType, class CollType>
HRESULT CreateSTLEnumerator(IUnknown** ppUnk, IUnknown* pUnkForRelease, 
   CollType& collection)
{
   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(pUnkForRelease, collection);

   if (SUCCEEDED(hr))
      hr = pEnum->QueryInterface(ppUnk);

   if (FAILED(hr))
      delete pEnum;

   return hr;
} // CreateSTLEnumerator

该函数模板可用于实现集合接口的 _NewEnum 属性,如下所示:

typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT>,
   std::vector<CComVariant> > VarVarEnum;

class ATL_NO_VTABLE CVariantCollection :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CVariantCollection, &CLSID_VariantCollection>,
   public IDispatchImpl<IVariantCollection, &IID_IVariantCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   std::vector<CComVariant> m_vec;

   STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
   {
      return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
   }

   // Remainder of class declaration omitted.

此代码为 CComEnumOnSTL 创建一个 typedef,后者通过 IEnumVariant 接口公开一个 CComVariant 的向量。 CVariantCollection 类只是专门化 CreateSTLEnumerator 来处理这种类型的枚举器对象。

另请参阅

IEnumOnSTLImpl
ATLCollections 示例:演示 ICollectionOnSTLImpl、CComEnumOnSTL 和自定义复制策略类
类概述
CComObjectRootEx 类
CComObjectThreadModel
IEnumOnSTLImpl 类