Bagikan melalui


Kelas CComEnumImpl

Kelas ini menyediakan implementasi untuk antarmuka enumerator COM tempat item yang dijumlahkan disimpan dalam array.

Sintaks

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

Parameter

Dasar
Antarmuka enumerator COM. Lihat IEnumString untuk contoh.

piid
Penunjuk ke ID antarmuka antarmuka enumerator.

T
Jenis item yang diekspos oleh antarmuka enumerator.

Menyalin
Kelas kebijakan penyalinan homogen.

Anggota

Konstruktor Publik

Nama Deskripsi
CComEnumImpl::CComEnumImpl Konstruktor.
CComEnumImpl::~CComEnumImpl Destruktor.

Metode Publik

Nama Deskripsi
CComEnumImpl::Clone Implementasi metode antarmuka enumerasi Kloning .
CComEnumImpl::Init Menginisialisasi enumerator.
CComEnumImpl::Berikutnya Implementasi Next.
CComEnumImpl::Reset Implementasi Reset.
CComEnumImpl::Lewati Implementasi Skip.

Anggota Data Publik

Nama Deskripsi
CComEnumImpl::m_begin Penunjuk ke item pertama dalam array.
CComEnumImpl::m_dwFlags Salin bendera yang diteruskan melalui Init.
CComEnumImpl::m_end Penunjuk ke lokasi tepat di luar item terakhir dalam array.
CComEnumImpl::m_iter Penunjuk ke item saat ini dalam array.
CComEnumImpl::m_spUnk Penunjuk IUnknown objek yang memasok koleksi yang sedang dijumlahkan.

Keterangan

Lihat IEnumString untuk contoh implementasi metode. CComEnumImpl menyediakan implementasi untuk antarmuka enumerator COM tempat item yang dijumlahkan disimpan dalam array. Kelas ini dianalogikan dengan IEnumOnSTLImpl kelas , yang menyediakan implementasi antarmuka enumerator berdasarkan kontainer Pustaka Standar C++.

Catatan

Untuk detail tentang perbedaan lebih lanjut antara CComEnumImpl dan IEnumOnSTLImpl, lihat CComEnumImpl::Init.

Biasanya, Anda tidak perlu membuat kelas enumerator Anda sendiri dengan turunan dari implementasi antarmuka ini. Jika Anda ingin menggunakan enumerator yang disediakan ATL berdasarkan array, lebih umum untuk membuat instans CComEnum.

Namun, jika Anda perlu menyediakan enumerator kustom (misalnya, yang mengekspos antarmuka selain antarmuka enumerator), Anda dapat berasal dari kelas ini. Dalam situasi ini, kemungkinan Anda harus mengambil alih metode CComEnumImpl::Clone untuk menyediakan implementasi Anda sendiri.

Untuk informasi selengkapnya, lihat Koleksi dan Enumerator ATL.

Hierarki Warisan

Base

CComEnumImpl

Persyaratan

Header: atlcom.h

CComEnumImpl::CComEnumImpl

Konstruktor.

CComEnumImpl();

CComEnumImpl::~CComEnumImpl

Destruktor.

~CComEnumImpl();

CComEnumImpl::Init

Anda harus memanggil metode ini sebelum meneruskan penunjuk ke antarmuka enumerator kembali ke klien mana pun.

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

Parameter

mulai
Penunjuk ke elemen pertama array yang berisi item yang akan dijumlahkan.

akhir
Penunjuk ke lokasi tepat di luar elemen terakhir array yang berisi item yang akan dijumlahkan.

Punk
[di] Penunjuk IUnknown objek yang harus tetap hidup selama masa pakai enumerator. Teruskan NULL jika tidak ada objek tersebut.

flags
Bendera yang menentukan apakah enumerator harus mengambil kepemilikan array atau membuat salinannya atau tidak. Nilai yang mungkin dijelaskan di bawah ini.

Tampilkan Nilai

Nilai HRESULT standar.

Keterangan

Hanya panggil metode ini sekali — inisialisasi enumerator, gunakan, lalu buang.

Jika Anda meneruskan penunjuk ke item dalam array yang disimpan di objek lain (dan Anda tidak meminta enumerator untuk menyalin data), Anda dapat menggunakan parameter pUnk untuk memastikan bahwa objek dan array yang dipegangnya tersedia selama enumerator membutuhkannya. Enumerator hanya memegang referensi COM pada objek untuk membuatnya tetap hidup. Referensi COM secara otomatis dirilis ketika enumerator dihancurkan.

Parameter bendera memungkinkan Anda menentukan bagaimana enumerator harus memperlakukan elemen array yang diteruskan ke dalamnya. bendera dapat mengambil salah satu nilai dari enumerasi yang CComEnumFlags ditunjukkan di bawah ini:

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

AtlFlagNoCopy berarti bahwa masa pakai array tidak dikontrol oleh enumerator. Dalam hal ini, array akan statis atau objek yang diidentifikasi oleh pUnk akan bertanggung jawab untuk membebaskan array ketika tidak lagi diperlukan.

AtlFlagTakeOwnership berarti bahwa penghancuran array akan dikendalikan oleh enumerator. Dalam hal ini, array harus dialokasikan secara dinamis menggunakan new. Enumerator akan menghapus array di destruktornya. Biasanya, Anda akan meneruskan NULL untuk pUnk, meskipun Anda masih dapat meneruskan pointer yang valid jika Anda perlu diberi tahu tentang penghancuran enumerator karena alasan tertentu.

AtlFlagCopy berarti bahwa array baru akan dibuat dengan menyalin array yang diteruskan ke Init. Masa pakai array baru akan dikontrol oleh enumerator. Enumerator akan menghapus array di destruktornya. Biasanya, Anda akan meneruskan NULL untuk pUnk, meskipun Anda masih dapat meneruskan pointer yang valid jika Anda perlu diberi tahu tentang penghancuran enumerator karena alasan tertentu.

Catatan

Prototipe metode ini menentukan elemen array sebagai jenis T, di mana T didefinisikan sebagai parameter templat ke kelas . Ini adalah jenis yang sama yang diekspos dengan metode antarmuka COM CComEnumImpl::Next. Implikasinya adalah bahwa, tidak seperti IEnumOnSTLImpl, kelas ini tidak mendukung penyimpanan yang berbeda dan jenis data yang diekspos. Jenis data elemen dalam array harus sama dengan jenis data yang diekspos dengan cara antarmuka COM.

CComEnumImpl::Clone

Metode ini menyediakan implementasi metode Kloning dengan membuat objek jenis CComEnum, menginisialisasinya dengan array dan iterator yang sama yang digunakan oleh objek saat ini, dan mengembalikan antarmuka pada objek yang baru dibuat.

STDMETHOD(Clone)(Base** ppEnum);

Parameter

ppEnum
[out] Antarmuka enumerator pada objek yang baru dibuat dikloning dari enumerator saat ini.

Tampilkan Nilai

Nilai HRESULT standar.

Keterangan

Perhatikan bahwa enumerator kloning tidak pernah membuat salinan mereka sendiri (atau mengambil kepemilikan) data yang digunakan oleh enumerator asli. Jika perlu, enumerator kloning akan menjaga enumerator asli tetap hidup (menggunakan referensi COM) untuk memastikan bahwa data tersedia selama mereka membutuhkannya.

CComEnumImpl::m_spUnk

Penunjuk cerdas ini mempertahankan referensi pada objek yang diteruskan ke CComEnumImpl::Init, memastikan bahwa itu tetap hidup selama masa pakai enumerator.

CComPtr<IUnknown> m_spUnk;

CComEnumImpl::m_begin

Penunjuk ke lokasi tepat di luar elemen terakhir array yang berisi item yang akan dijumlahkan.

T* m_begin;

CComEnumImpl::m_end

Penunjuk ke elemen pertama array yang berisi item yang akan dijumlahkan.

T* m_end;

CComEnumImpl::m_iter

Penunjuk ke elemen array saat ini yang berisi item yang akan dijumlahkan.

T* m_iter;

CComEnumImpl::m_dwFlags

Bendera diteruskan ke CComEnumImpl::Init.

DWORD m_dwFlags;

CComEnumImpl::Berikutnya

Metode ini menyediakan implementasi metode Berikutnya .

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

Parameter

celt
[di] Jumlah elemen yang diminta.

rgelt
[out] Array yang akan diisi dengan elemen.

pceltFetched
[out] Jumlah elemen benar-benar dikembalikan dalam rgelt. Ini bisa kurang dari celt jika kurang dari elemen celt tetap ada dalam daftar.

Tampilkan Nilai

Nilai HRESULT standar.

CComEnumImpl::Reset

Metode ini menyediakan implementasi metode Reset .

STDMETHOD(Reset)(void);

Tampilkan Nilai

Nilai HRESULT standar.

CComEnumImpl::Lewati

Metode ini menyediakan implementasi metode Lewati.

STDMETHOD(Skip)(ULONG celt);

Parameter

celt
[di] Jumlah elemen yang akan dilewati.

Tampilkan Nilai

Nilai HRESULT standar.

Keterangan

Mengembalikan E_INVALIDARG jika celt adalah nol, mengembalikan S_FALSE jika kurang dari elemen celt dikembalikan, mengembalikan S_OK sebaliknya.

Lihat juga

Kelas IEnumOnSTLImpl
Kelas CComEnum
Gambaran Umum Kelas