CComEnumImpl 類別
這個類別提供 COM 列舉值介面的實作,其中列舉的專案會儲存在陣列中。
語法
template <class Base,
const IID* piid, class T, class Copy>
class ATL_NO_VTABLE CComEnumImpl : public Base
參數
Base
COM 列舉值介面。 如需範例,請參閱 IEnumString 。
piid
列舉值介面之介面標識碼的指標。
T
列舉值介面所公開的項目類型。
複製
同質 複製原則類別。
成員
公用建構函式
名稱 | 描述 |
---|---|
CComEnumImpl::CComEnumImpl | 建構函式。 |
CComEnumImpl::~CComEnumImpl | 解構函式。 |
公用方法
名稱 | 描述 |
---|---|
CComEnumImpl::Clone | Clone 列舉介面方法的實作。 |
CComEnumImpl::Init | 初始化列舉程式。 |
CComEnumImpl::Next | Next 的實作。 |
CComEnumImpl::Reset | Reset 的實作。 |
CComEnumImpl::Skip | Skip 的實作。 |
公用資料成員
名稱 | 描述 |
---|---|
CComEnumImpl::m_begin | 陣列中第一個專案的指標。 |
CComEnumImpl::m_dwFlags | 複製傳遞的 Init 旗標。 |
CComEnumImpl::m_end | 陣列中最後一個專案以外的位置指標。 |
CComEnumImpl::m_iter | 陣列中目前專案的指標。 |
CComEnumImpl::m_spUnk | IUnknown 物件的指標,提供要列舉的集合。 |
備註
如需方法實作的範例,請參閱 IEnumString 。 CComEnumImpl
提供 COM 列舉值介面的實作,其中列舉的專案會儲存在陣列中。 這個類別類似於 IEnumOnSTLImpl
類別,其會根據標準連結庫容器C++提供列舉值介面的實作。
注意
如需 和 IEnumOnSTLImpl
之間CComEnumImpl
進一步差異的詳細資訊,請參閱 CComEnumImpl::Init。
一般而言,您 不需要 從這個介面實作衍生來建立自己的列舉值類別。 如果您想要根據陣列使用ATL提供的列舉值,建立 CComEnum 實例比較常見。
不過,如果您需要提供自定義列舉值(例如,除了列舉值介面之外公開介面的列舉值,也可以衍生自這個類別。 在此情況下,您可能需要覆寫 CComEnumImpl::Clone 方法來提供您自己的實作。
如需詳細資訊,請參閱 ATL 集合和列舉值。
繼承階層架構
Base
CComEnumImpl
需求
標頭: atlcom.h
CComEnumImpl::CComEnumImpl
建構函式。
CComEnumImpl();
CComEnumImpl::~CComEnumImpl
解構函式。
~CComEnumImpl();
CComEnumImpl::Init
您必須先呼叫這個方法,才能將指標傳遞回任何用戶端的列舉值介面。
HRESULT Init(
T* begin,
T* end,
IUnknown* pUnk,
CComEnumFlags flags = AtlFlagNoCopy);
參數
begin
陣列第一個專案的指標,其中包含要列舉的專案。
end
陣列最後一個專案以外的位置指標,其中包含要列舉的專案。
朋克
[in] IUnknown
在列舉值存留期間必須保持運作的物件指標。 如果不存在這類物件,則傳遞NULL。
flags
旗標,指定列舉值是否應該取得數位的擁有權,或建立陣列的複本。 可能的值如下所述。
傳回值
標準 HRESULT 值。
備註
只呼叫這個方法一次 — 初始化列舉值、使用它,然後將它扔掉。
如果您將指標傳遞至位於另一個物件中陣列中的專案(而且您不要求列舉值複製數據),您可以使用 pUnk 參數來確保只要列舉值需要它們,就可以使用物件及其保存的陣列。 列舉值只會在 物件上保存 COM 參考,讓它保持運作。 列舉值終結時,會自動釋放 COM 參考。
flags 參數可讓您指定列舉值如何處理傳遞給它的陣列專案。 旗標可以從如下所示的CComEnumFlags
列舉中取得其中一個值:
enum CComEnumFlags
{
AtlFlagNoCopy = 0,
AtlFlagTakeOwnership = 2, // BitOwn
AtlFlagCopy = 3 // BitOwn | BitCopy
};
AtlFlagNoCopy
表示陣列的存留期不受列舉值控制。 在此情況下,陣列會是靜態的,或者 pUnk 所識別的對象將負責在不再需要數位時釋放陣列。
AtlFlagTakeOwnership
表示陣列的解構是由列舉值所控制。 在此情況下,陣列必須使用 動態配置 new
。 列舉值會刪除其解構函式中的陣列。 一般而言,您會針對 pUnk 傳遞 NULL,不過如果您需要因某些原因而收到列舉值解構的通知,您仍然可以傳遞有效的指標。
AtlFlagCopy
表示要藉由複製傳遞至 Init
的陣列來建立新的陣列。 新陣列的存留期將由列舉值控制。 列舉值會刪除其解構函式中的陣列。 一般而言,您會針對 pUnk 傳遞 NULL,不過如果您需要因某些原因而收到列舉值解構的通知,您仍然可以傳遞有效的指標。
注意
這個方法的原型會將陣列元素指定為型 T
別,其中 T
定義為 類別的樣板參數。 這是透過 COM 介面方法 CComEnumImpl::Next 公開的相同類型。 這的含意在於,與 IEnumOnSTLImpl 不同,這個類別不支援不同的記憶體和公開的數據類型。 陣列中元素的數據類型必須與 COM 介面所公開的數據類型相同。
CComEnumImpl::Clone
這個方法提供 Clone 方法的實作,方法是建立 類型的 CComEnum
物件、使用目前 物件所使用的相同數位和反覆運算器初始化它,並在新建立的物件上傳回 介面。
STDMETHOD(Clone)(Base** ppEnum);
參數
ppEnum
[out]從目前列舉值複製之新建立物件的枚舉器介面。
傳回值
標準 HRESULT 值。
備註
請注意,複製的列舉值絕不會自行複製原始列舉值所使用的數據(或取得擁有權)。 如有必要,複製的列舉值會讓原始列舉值保持運作狀態(使用 COM 參考),以確保只要需要數據即可使用。
CComEnumImpl::m_spUnk
這個智慧型指標會在傳遞至 CComEnumImpl::Init 的物件上維護參考,確保它在列舉值存留期間保持運作。
CComPtr<IUnknown> m_spUnk;
CComEnumImpl::m_begin
陣列最後一個專案以外的位置指標,其中包含要列舉的專案。
T* m_begin;
CComEnumImpl::m_end
陣列第一個專案的指標,其中包含要列舉的專案。
T* m_end;
CComEnumImpl::m_iter
陣列目前專案的指標,其中包含要列舉的專案。
T* m_iter;
CComEnumImpl::m_dwFlags
傳遞至 CComEnumImpl::Init 的旗標。
DWORD m_dwFlags;
CComEnumImpl::Next
這個方法提供 Next 方法的實作。
STDMETHOD(Next)(ULONG celt, T* rgelt, ULONG* pceltFetched);
參數
塞爾特人
[in]要求的元素數目。
rgelt
[out]要填入元素的陣列。
pceltFetched
[out]實際在 rgelt 中傳回的元素數目。 如果清單中保留少於 celt 元素,則這可能會小於 celt。
傳回值
標準 HRESULT 值。
CComEnumImpl::Reset
此方法提供 Reset 方法的實作。
STDMETHOD(Reset)(void);
傳回值
標準 HRESULT 值。
CComEnumImpl::Skip
這個方法提供 Skip 方法的實作。
STDMETHOD(Skip)(ULONG celt);
參數
塞爾特人
[in]要略過的項目數目。
傳回值
標準 HRESULT 值。
備註
如果 celt 為零,則傳回E_INVALIDARG;如果傳回小於 celt 元素,則傳回S_FALSE,否則會傳回S_OK。