Sdílet prostřednictvím


CComEnumImpl – třída

Tato třída poskytuje implementaci pro rozhraní enumerátoru COM, kde jsou položky výčtu uloženy v poli.

Syntaxe

template <class Base,
    const IID* piid, class T, class Copy>
class ATL_NO_VTABLE CComEnumImpl : public Base

Parametry

Základna
Rozhraní enumerátoru COM. Příklad najdete v souboru IEnumString .

piid
Ukazatel na ID rozhraní enumerátoru.

T
Typ položky vystavené rozhraním enumerátoru.

Kopírování
Homogenní třída zásad kopírování.

Členové

Veřejné konstruktory

Název Popis
CComEnumImpl::CComEnumImpl Konstruktor
CComEnumImpl::~CComEnumImpl Destruktor.

Veřejné metody

Název Popis
CComEnumImpl::Clone Implementace klonovací metody rozhraní výčtu.
CComEnumImpl::Init Inicializuje enumerátor.
CComEnumImpl::Next Implementace dalšího.
CComEnumImpl::Reset Implementace resetování.
CComEnumImpl::Skip Implementace skipu.

Veřejné datové členy

Název Popis
CComEnumImpl::m_begin Ukazatel na první položku v poli.
CComEnumImpl::m_dwFlags Zkopírujte příznaky předané .Init
CComEnumImpl::m_end Ukazatel na umístění za poslední položkou v poli.
CComEnumImpl::m_iter Ukazatel na aktuální položku v poli.
CComEnumImpl::m_spUnk Ukazatel IUnknown objektu poskytujícího kolekci výčtu.

Poznámky

Příklad implementace metod najdete v souboru IEnumString . CComEnumImpl poskytuje implementaci pro enumerátor com rozhraní, kde jsou položky výčtu uloženy v poli. Tato třída je analogická ke IEnumOnSTLImpl třídě, která poskytuje implementaci rozhraní enumerátoru založeného na kontejneru standardní knihovny jazyka C++.

Poznámka:

Podrobnosti o dalších rozdílech mezi CComEnumImpl a IEnumOnSTLImpl, viz CComEnumImpl::Init.

Obvykle nebudete muset vytvořit vlastní enumerator třídy odvozené z této implementace rozhraní. Pokud chcete použít enumerátor atL zadaný na základě pole, je častější vytvořit instanci CComEnum.

Pokud však potřebujete poskytnout vlastní enumerátor (například ten, který zveřejňuje rozhraní kromě rozhraní enumerátoru), můžete odvodit z této třídy. V této situaci je pravděpodobné, že budete muset přepsat CComEnumImpl::Clone metoda poskytnout vlastní implementaci.

Další informace naleznete v tématu ATL Collections and Enumerators.

Hierarchie dědičnosti

Base

CComEnumImpl

Požadavky

Hlavička: atlcom.h

CComEnumImpl::CComEnumImpl

Konstruktor

CComEnumImpl();

CComEnumImpl::~CComEnumImpl

Destruktor.

~CComEnumImpl();

CComEnumImpl::Init

Před předáním ukazatele na rozhraní enumerátoru zpět všem klientům musíte tuto metodu volat.

HRESULT Init(
    T* begin,
    T* end,
    IUnknown* pUnk,
    CComEnumFlags flags = AtlFlagNoCopy);

Parametry

začít
Ukazatel na první prvek pole obsahující položky, které mají být výčty.

konec
Ukazatel na umístění těsně za posledním prvkem pole obsahujícího položky, které mají být výčty.

punk
[v] Ukazatel IUnknown objektu, který musí být udržován naživu během životnosti enumerátoru. Pokud takový objekt neexistuje, předejte hodnotu NULL.

vlajky
Příznaky určující, zda má enumerátor převzít vlastnictví pole nebo vytvořit jeho kopii. Možné hodnoty jsou popsány níže.

Návratová hodnota

Standardní hodnota HRESULT.

Poznámky

Tuto metodu zavolejte pouze jednou – inicializujete enumerátor, použijete ji a pak ji vyhodíte.

Pokud předáte ukazatele na položky v poli uchovávaném v jiném objektu (a neptáte se enumerátoru, aby zkopíroval data), můžete pomocí parametru pUnk zajistit, aby objekt a pole, které obsahuje, byly k dispozici tak dlouho, dokud je enumerátor potřebuje. Enumerátor jednoduše uchovává odkaz MODELU COM na objekt, aby byl aktivní. Odkaz modelu COM se automaticky uvolní při zničení enumerátoru.

Parametr flags umožňuje určit, jak má enumerátor zacházet s prvky pole předanými do něj. Příznaky můžou mít jednu z hodnot z výčtu CComEnumFlags uvedeného níže:

enum CComEnumFlags
   {
   AtlFlagNoCopy = 0,
   AtlFlagTakeOwnership = 2, // BitOwn
   AtlFlagCopy = 3           // BitOwn | BitCopy
   };

AtlFlagNoCopy znamená, že životnost pole není řízena enumerátorem. V tomto případě bude pole statické nebo objekt identifikovaný pomocí pUnk bude zodpovědný za uvolnění pole, když už není potřeba.

AtlFlagTakeOwnership znamená, že zničení pole je řízeno enumerátorem. V tomto případě musí být pole dynamicky přiděleno pomocí new. Enumerátor odstraní pole v jeho destruktoru. Obvykle byste předali hodnotu NULL pro pUnk, i když stále můžete předat platný ukazatel, pokud potřebujete být upozorněni na zničení enumerátoru z nějakého důvodu.

AtlFlagCopy znamená, že se vytvoří nové pole zkopírováním pole předaného do Init. Životnost nového pole je řízena enumerátorem. Enumerátor odstraní pole v jeho destruktoru. Obvykle byste předali hodnotu NULL pro pUnk, i když stále můžete předat platný ukazatel, pokud potřebujete být upozorněni na zničení enumerátoru z nějakého důvodu.

Poznámka:

Prototyp této metody určuje prvky pole jako typ T, kde T byl definován jako parametr šablony třídy. Jedná se o stejný typ, který je vystaven prostřednictvím metody rozhraní COM CComEnumImpl::Next. Implikací tohoto je, že na rozdíl od IEnumOnSTLImpl tato třída nepodporuje různé typy úložiště a vystavené datové typy. Datový typ prvků v poli musí být stejný jako datový typ vystavený prostřednictvím rozhraní MODELU COM.

CComEnumImpl::Clone

Tato metoda poskytuje implementaci Clone metoda vytvořením objektu typu CComEnum, inicializace pomocí stejného pole a iterátoru používaného aktuálním objektem a vrácení rozhraní na nově vytvořeném objektu.

STDMETHOD(Clone)(Base** ppEnum);

Parametry

ppEnum
[ven] Rozhraní enumerátoru na nově vytvořeném objektu klonovaném z aktuálního enumerátoru.

Návratová hodnota

Standardní hodnota HRESULT.

Poznámky

Všimněte si, že klonované enumerátory nikdy netvořily vlastní kopii (nebo převzít vlastnictví) dat používaných původním enumerátorem. V případě potřeby budou klonované enumerátory udržovat původní enumerátor aktivní (pomocí odkazu modelu COM), aby bylo zajištěno, že data budou k dispozici, dokud je potřebují.

CComEnumImpl::m_spUnk

Tento inteligentní ukazatel udržuje odkaz na objekt předaný CComEnumImpl::Init a zajišťuje, aby zůstal aktivní během životnosti enumerátoru.

CComPtr<IUnknown> m_spUnk;

CComEnumImpl::m_begin

Ukazatel na umístění těsně za posledním prvkem pole obsahujícího položky, které mají být výčty.

T* m_begin;

CComEnumImpl::m_end

Ukazatel na první prvek pole obsahující položky, které mají být výčty.

T* m_end;

CComEnumImpl::m_iter

Ukazatel na aktuální prvek pole obsahující položky, které mají být výčty.

T* m_iter;

CComEnumImpl::m_dwFlags

Příznaky předané CComEnumImpl::Init.

DWORD m_dwFlags;

CComEnumImpl::Next

Tato metoda poskytuje implementaci další metody.

STDMETHOD(Next)(ULONG celt, T* rgelt, ULONG* pceltFetched);

Parametry

Kelt
[v] Požadovaný počet prvků.

rgelt
[ven] Pole, které má být vyplněno prvky.

pceltFetched
[ven] Počet prvků vrácených v rgeltu. To může být menší než celt , pokud méně než celt prvky zůstaly v seznamu.

Návratová hodnota

Standardní hodnota HRESULT.

CComEnumImpl::Reset

Tato metoda poskytuje implementaci metody Reset .

STDMETHOD(Reset)(void);

Návratová hodnota

Standardní hodnota HRESULT.

CComEnumImpl::Skip

Tato metoda poskytuje implementaci metody Skip .

STDMETHOD(Skip)(ULONG celt);

Parametry

Kelt
[v] Počet prvků, které se mají přeskočit.

Návratová hodnota

Standardní hodnota HRESULT.

Poznámky

Vrátí E_INVALIDARG pokud je celt nula, vrátí S_FALSE pokud jsou vráceny menší než celt prvky, vrátí S_OK jinak.

Viz také

IEnumOnSTLImpl – třída
CComEnum – třída
Přehled třídy