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


Класс 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>

Параметры

Основание
Интерфейс перечислителя COM. См . пример IEnumString .

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

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

Копировать
Однородный класс политики копирования.

ThreadModel
Модель потоков класса. Этот параметр по умолчанию используется в глобальной объектной модели потока, используемой в проекте.

Замечания

CComEnum определяет объект перечислителя COM на основе массива. Этот класс аналогичен CComEnumOnSTL , который реализует перечислитель на основе контейнера стандартной библиотеки C++. Ниже описаны типичные шаги по использованию этого класса. Дополнительные сведения см. в разделе "Коллекции и перечислители ATL".

Чтобы использовать этот класс, выполните указанные ниже действия.

  • typedef специализация этого класса.

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

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

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

  • Верните интерфейс перечислителя клиенту.

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

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

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.

Этот код создает typedef для CComEnum этого вектор VARIANTs через IEnumVariant интерфейс. Класс CVariantArrayCollection просто специализируется CreateEnumerator на работе с объектами перечислителя этого типа и передает необходимые аргументы.

См. также

Общие сведения о классе
CComObjectThreadModel
Класс CComEnumImpl
Класс CComObjectRootEx