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


CComEnumOnSTL Class

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

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 (IEnumXXXX).

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

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

  • Copy
    Класс политика копии.

  • CollType
    Класс контейнеров STL.

Заметки

CComEnumOnSTL определяет объект перечислителя модели COM на основе коллекций STL. Этот класс может использоваться отдельно или совместно с ICollectionOnSTLImpl. Типичные действия по использованию этого класса конспектированы ниже. Дополнительные сведения см. в разделе Коллекции и перечислители библиотеки ATL.

Чтобы использовать этот класс, ICollectionOnSTLImpl:

  • typedef специализация класса.

  • Используйте typedef как последний аргумент шаблона в специализации ICollectionOnSTLImpl.

См. раздел Коллекции и перечислители библиотеки ATL для примера.

Использовать этот класс, независимо от ICollectionOnSTLImpl:

  • typedef специализация класса.

  • Используйте typedef в качестве аргумента шаблона в специализации CComObject.

  • Создайте экземпляр CComObject специализации.

  • Инициализируйте объект путем вызова IEnumOnSTLImpl::Init перечислителя.

  • Возвращает интерфейс перечислителя клиенту.

Иерархия наследования

CComObjectRootBase

Base

CComObjectRootEx

IEnumOnSTLImpl

CComEnumOnSTL

Требования

Header: 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, который представляет вектор CComVariant s посредством интерфейса IEnumVariant. Класс CVariantCollection просто специализирует CreateSTLEnumerator для работы с объектами перечислителя данного типа.

См. также

Ссылки

CComObjectRootEx Class

CComObjectThreadModel

IEnumOnSTLImpl Class

IEnumOnSTLImpl

Основные понятия

Образец ATLCollections: Демонстрация ICollectionOnSTLImpl, CComEnumOnSTL и пользовательских классов политики копирования

Другие ресурсы

ATL Class Overview