Поделиться через


Класс CComEnumOnSTL

Этот класс определяет объект перечислителя COM на основе коллекции стандартной библиотеки C++.

Синтаксис

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>

Параметры

Основание
Перечислитель COM. См . пример IEnumString .

piid
Указатель на идентификатор интерфейса интерфейса перечислителя.

T
Тип элемента, предоставляемый интерфейсом перечислителя.

Копировать
Класс политики копирования.

CollType
Класс контейнера стандартной библиотеки C++.

Замечания

CComEnumOnSTL определяет объект перечислителя COM на основе коллекции стандартной библиотеки C++. Этот класс можно использовать самостоятельно или в сочетании с 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.

Этот код создает typedef для CComEnumOnSTL этого вектор s CComVariantс помощью IEnumVariant интерфейса. Класс CVariantCollection просто специализируется CreateSTLEnumerator на работе с объектами перечислителя этого типа.

См. также

IEnumOnSTLImpl
Пример ATLCollections: демонстрирует классы политик ICollectionOnSTLImpl, CComEnumOnSTL и настраиваемые классы политик копирования
Общие сведения о классе
Класс CComObjectRootEx
CComObjectThreadModel
Класс IEnumOnSTLImpl