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 >
參數
Base
COM 列舉值 (IEnumXXXX) 介面。piid
out 列舉值介面的介面 ID 的指標。T
列舉值介面公開的項目型別。Copy
同質性 複製原則類別。ThreadModel
類別的執行緒模型。這個參數會預設為用於專案的全域物件執行緒模型。
備註
CComEnum 定義根據陣列的 COM 列舉值物件。實作以 STL 容器的列舉值的這個類別 (Class) 類似 CComEnumOnSTL 。的一般步驟。使用這個類別會在中說明。如需詳細資訊,請參閱 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.
藉由 IEnumVariant 介面公開 VARIANTs 向量的這個程式碼會建立 CComEnum 的 typedef 。CVariantArrayCollection 類別特製化 CreateEnumerator 與型別搭配使用列舉值物件並將必要的引數。