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
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 для работы с объектами перечислителя этого типа и передающий необходимые аргументы.