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


Класс CComEnum

Замечание

Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.

Этот класс определяет объект перечислителя 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