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


CComEnum Class

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

Параметры

  • Base
    Интерфейс перечислителя модели COM (IEnumXXXX).

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

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

  • Copy
    Однотиповое скопируйте класс политик.

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

Заметки

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

Использовать этот класс.

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

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

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

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

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

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

CComObjectRootBase

Base

CComObjectRootEx

CComEnumImpl

CComEnum

Требования

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

См. также

Ссылки

CComObjectThreadModel

CComEnumImpl Class

CComObjectRootEx Class

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

ATL Class Overview