共用方式為


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物件的指標,提供要列舉的集合。

備註

如需方法實作的範例,請參閱 IEnumStringCComEnumImpl 提供 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。

另請參閱

IEnumOnSTLImpl 類別
CComEnum 類別
類別概觀