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