CComEnumOnSTL Class
Этот класс определяет объект перечислителя модели COM на основе коллекций STL.
template <
class Base,
const IID* piid,
class T,
class Copy,
class CollType,
class ThreadModel = CComObjectThreadModel
>
class ATL_NO_VTABLE CComEnumOnSTL :
public IEnumOnSTLImpl<Base, piid, T, Copy, CollType>,
public CComObjectRootEx< ThreadModel >
Параметры
Base
Интерфейс перечислителя модели COM (IEnumXXXX).piid
Указатель на идентификатор интерфейса интерфейса перечислителя.T
Тип элемента, предоставляемый интерфейсом перечислителя.Copy
Класс политика копии.CollType
Класс контейнеров STL.
Заметки
CComEnumOnSTL определяет объект перечислителя модели COM на основе коллекций STL. Этот класс может использоваться отдельно или совместно с ICollectionOnSTLImpl. Типичные действия по использованию этого класса конспектированы ниже. Дополнительные сведения см. в разделе Коллекции и перечислители библиотеки ATL.
Чтобы использовать этот класс, ICollectionOnSTLImpl:
typedef специализация класса.
Используйте typedef как последний аргумент шаблона в специализации ICollectionOnSTLImpl.
См. раздел Коллекции и перечислители библиотеки ATL для примера.
Использовать этот класс, независимо от ICollectionOnSTLImpl:
typedef специализация класса.
Используйте typedef в качестве аргумента шаблона в специализации CComObject.
Создайте экземпляр CComObject специализации.
Инициализируйте объект путем вызова IEnumOnSTLImpl::Init перечислителя.
Возвращает интерфейс перечислителя клиенту.
Иерархия наследования
CComObjectRootBase
Base
CComEnumOnSTL
Требования
Header: atlcom.h
Пример
Код, показанный ниже предоставляет универсальную функцию для обработки создание и инициализация объекта перечислителя.
template <class EnumType, class CollType>
HRESULT CreateSTLEnumerator(IUnknown** ppUnk, IUnknown* pUnkForRelease,
CollType& collection)
{
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(pUnkForRelease, collection);
if (SUCCEEDED(hr))
hr = pEnum->QueryInterface(ppUnk);
if (FAILED(hr))
delete pEnum;
return hr;
} // CreateSTLEnumerator
Эту функцию шаблона можно использовать для реализации свойство _NewEnum интерфейса коллекции, как показано ниже:
typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT>,
std::vector<CComVariant> > VarVarEnum;
class ATL_NO_VTABLE CVariantCollection :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CVariantCollection, &CLSID_VariantCollection>,
public IDispatchImpl<IVariantCollection, &IID_IVariantCollection, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
std::vector<CComVariant> m_vec;
STDMETHOD(get__NewEnum)(IUnknown** ppUnk)
{
return CreateSTLEnumerator<VarVarEnum>(ppUnk, this, m_vec);
}
// Remainder of class declaration omitted.
Этот код создает typedef для CComEnumOnSTL, который представляет вектор CComVariant s посредством интерфейса IEnumVariant. Класс CVariantCollection просто специализирует CreateSTLEnumerator для работы с объектами перечислителя данного типа.