Bagikan melalui


Makro COM_INTERFACE_ENTRY

Makro ini memasukkan antarmuka objek ke dalam peta COM-nya sehingga dapat diakses oleh QueryInterface. Urutan entri dalam peta COM adalah antarmuka pesanan akan diperiksa untuk IID yang cocok selama QueryInterface.

Makro Deskripsi
COM_INTERFACE_ENTRY Memasukkan antarmuka ke dalam peta antarmuka COM.
COM_INTERFACE_ENTRY2 Gunakan makro ini untuk memisahkan dua cabang warisan.
COM_INTERFACE_ENTRY_IID Gunakan makro ini untuk memasukkan antarmuka ke dalam peta COM dan tentukan IID-nya.
COM_INTERFACE_ENTRY2_IID Sama seperti COM_INTERFACE_ENTRY2, kecuali Anda dapat menentukan IID yang berbeda.
COM_INTERFACE_ENTRY_AGGREGATE Ketika antarmuka yang diidentifikasi oleh iid dikueri, COM_INTERFACE_ENTRY_AGGREGATE teruskan ke punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND Sama seperti COM_INTERFACE_ENTRY_AGGREGATE, kecuali bahwa kueri untuk IID apa pun menghasilkan penerusan kueri ke punk.
COM_INTERFACE_ENTRY_AUTOAGGREGATE Sama seperti COM_INTERFACE_ENTRY_AGGREGATE, kecuali jika punk adalah NULL, ia secara otomatis membuat agregat yang dijelaskan oleh clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND Sama seperti COM_INTERFACE_ENTRY_AUTOAGGREGATE, kecuali bahwa kueri untuk IID menghasilkan penerusan kueri ke punk, dan jika punk adalah NULL, secara otomatis membuat agregat yang dijelaskan oleh clsid.
COM_INTERFACE_ENTRY_BREAK Menyebabkan program Anda memanggil DebugBreak ketika antarmuka yang ditentukan dikueri.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Menyimpan data khusus antarmuka untuk setiap instans.
COM_INTERFACE_ENTRY_TEAR_OFF Mengekspos antarmuka air mata Anda.
COM_INTERFACE_ENTRY_CHAIN Memproses peta COM dari kelas dasar ketika pemrosesan mencapai entri ini di peta COM.
COM_INTERFACE_ENTRY_FUNC Mekanisme umum untuk menghubungkan ke logika ATL QueryInterface .
COM_INTERFACE_ENTRY_FUNC_BLIND Sama seperti COM_INTERFACE_ENTRY_FUNC, kecuali kueri untuk IID apa pun menghasilkan panggilan ke func.
COM_INTERFACE_ENTRY_NOINTERFACE Mengembalikan E_NOINTERFACE dan mengakhiri pemrosesan peta COM saat antarmuka yang ditentukan dikueri.

Persyaratan

Header: atlcom.h

COM_INTERFACE_ENTRY

Memasukkan antarmuka ke dalam peta antarmuka COM.

Sintaks

COM_INTERFACE_ENTRY( x )

Parameter

x
[di] Nama antarmuka yang berasal dari objek kelas Anda secara langsung.

Keterangan

Biasanya, ini adalah jenis entri yang paling sering Anda gunakan.

Contoh

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

Persyaratan

Header: atlcom.h

COM_INTERFACE_ENTRY2

Gunakan makro ini untuk memisahkan dua cabang warisan.

COM_INTERFACE_ENTRY2(x, x2)

Parameter

x
[di] Nama antarmuka yang ingin Anda ekspos dari objek Anda.

x2
[di] Nama cabang warisan tempat x diekspos.

Keterangan

Misalnya, jika Anda memperoleh objek kelas dari dua antarmuka ganda, Anda mengekspos IDispatch menggunakan COM_INTERFACE_ENTRY2 karena IDispatch dapat diperoleh dari salah satu antarmuka.

Contoh

class ATL_NO_VTABLE CEntry2Example :
   public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
   public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
   CEntry2Example()
   {
   }

BEGIN_COM_MAP(CEntry2Example)
   COM_INTERFACE_ENTRY(IEntry2Example)
   COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};

COM_INTERFACE_ENTRY_IID

Gunakan makro ini untuk memasukkan antarmuka ke dalam peta COM dan tentukan IID-nya.

COM_INTERFACE_ENTRY_IID(iid, x)

Parameter

iid
[di] GUID antarmuka yang diekspos.

x
[di] Nama kelas yang vtable-nya akan diekspos sebagai antarmuka yang diidentifikasi oleh iid.

Contoh

BEGIN_COM_MAP(CExample)
   COM_INTERFACE_ENTRY(IExample)
   COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
   COM_INTERFACE_ENTRY(IExampleBase)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

COM_INTERFACE_ENTRY2_IID

Sama seperti COM_INTERFACE_ENTRY2, kecuali Anda dapat menentukan IID yang berbeda.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Parameter

iid
[di] GUID yang Anda tentukan untuk antarmuka.

x
[di] Nama antarmuka yang berasal dari objek kelas Anda secara langsung.

x2
[di] Nama antarmuka kedua yang berasal dari objek kelas Anda secara langsung.

COM_INTERFACE_ENTRY_AGGREGATE

Ketika antarmuka yang diidentifikasi oleh iid dikueri, COM_INTERFACE_ENTRY_AGGREGATE meneruskan ke punk.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Parameter

iid
[di] GUID antarmuka yang dikueri.

Punk
[di] Nama penunjuk IUnknown .

Keterangan

Parameter punk diasumsikan untuk menunjuk ke bagian dalam yang tidak diketahui dari agregat atau ke NULL, dalam hal ini entri diabaikan. Biasanya, Anda akan CoCreate agregat di FinalConstruct.

Contoh

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

Sama seperti COM_INTERFACE_ENTRY_AGGREGATE, kecuali bahwa kueri untuk IID apa pun menghasilkan penerusan kueri ke punk.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Parameter

Punk
[di] Nama penunjuk IUnknown .

Keterangan

Jika kueri antarmuka gagal, pemrosesan peta COM berlanjut.

Contoh

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

Sama seperti COM_INTERFACE_ENTRY_AGGREGATE, kecuali jika punk adalah NULL, ia secara otomatis membuat agregat yang dijelaskan oleh clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Parameter

iid
[di] GUID antarmuka yang dikueri.

Punk
[di] Nama penunjuk IUnknown . Harus merupakan anggota kelas yang berisi peta COM.

clsid
[di] Pengidentifikasi agregat yang akan dibuat jika punk adalah NULL.

Keterangan

Contoh

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

Sama seperti COM_INTERFACE_ENTRY_AUTOAGGREGATE, kecuali bahwa kueri untuk IID menghasilkan penerusan kueri ke punk, dan jika punk adalah NULL, secara otomatis membuat agregat yang dijelaskan oleh clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Parameter

Punk
[di] Nama penunjuk IUnknown . Harus merupakan anggota kelas yang berisi peta COM.

clsid
[di] Pengidentifikasi agregat yang akan dibuat jika punk adalah NULL.

Keterangan

Jika kueri antarmuka gagal, pemrosesan peta COM berlanjut.

Contoh

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

Menyebabkan program Anda memanggil DebugBreak ketika antarmuka yang ditentukan dikueri.

COM_INTERFACE_ENTRY_BREAK(x)

Parameter

x
[di] Teks yang digunakan untuk membuat pengidentifikasi antarmuka.

Keterangan

IID antarmuka akan dibangun dengan menambahkan x ke IID_. Misalnya, jika x adalah IPersistStorage, IID akan menjadi IID_IPersistStorage.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Menyimpan data khusus antarmuka untuk setiap instans.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Parameter

iid
[di] GUID antarmuka yang dirobek.

x
[di] Nama kelas yang mengimplementasikan antarmuka.

Punk
[di] Nama penunjuk IUnknown . Harus merupakan anggota kelas yang berisi peta COM. Harus diinisialisasi ke NULL di konstruktor objek kelas.

Keterangan

Jika antarmuka tidak digunakan, ini menurunkan ukuran instans keseluruhan objek Anda.

Contoh

BEGIN_COM_MAP(COuter)
   COM_INTERFACE_ENTRY(IOuter)
   COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()

COM_INTERFACE_ENTRY_TEAR_OFF

Mengekspos antarmuka air mata Anda.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Parameter

iid
[di] GUID antarmuka yang dirobek.

x
[di] Nama kelas yang mengimplementasikan antarmuka.

Keterangan

Antarmuka air mata diimplementasikan sebagai objek terpisah yang dibuat setiap kali antarmuka yang diwakilinya dikueri. Biasanya, Anda membangun antarmuka sebagai robek-off jika antarmuka jarang digunakan, karena ini menyimpan pointer vtable di setiap instans objek utama Anda. Pemisah dihapus ketika jumlah referensinya menjadi nol. Kelas yang mengimplementasikan tear-off harus berasal dari CComTearOffObjectBase dan memiliki peta COM sendiri.

Contoh

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

COM_INTERFACE_ENTRY_CHAIN

Memproses peta COM dari kelas dasar ketika pemrosesan mencapai entri ini di peta COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Parameter

nama kelas
[di] Kelas dasar objek saat ini.

Keterangan

Misalnya, dalam kode berikut:

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

Perhatikan bahwa entri pertama dalam peta COM harus merupakan antarmuka pada objek yang berisi peta COM. Dengan demikian, Anda tidak dapat memulai entri peta COM dengan COM_INTERFACE_ENTRY_CHAIN, yang menyebabkan peta COM dari objek yang berbeda dicari pada titik di mana COM_INTERFACE_ENTRY_CHAIN(COtherObject) muncul di peta COM objek Anda. Jika Anda ingin mencari peta COM objek lain terlebih dahulu, tambahkan entri antarmuka untuk IUnknown peta COM Anda, lalu rantai peta COM objek lainnya. Contohnya:

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

Mekanisme umum untuk menghubungkan ke logika ATL QueryInterface .

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Parameter

iid
[di] GUID antarmuka yang diekspos.

Dw
[di] Parameter diteruskan ke func.

func
[di] Penunjuk fungsi yang akan mengembalikan iid.

Keterangan

Jika iid cocok dengan IID antarmuka yang dikueri, maka fungsi yang ditentukan oleh func dipanggil. Deklarasi untuk fungsi harus:

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

Saat fungsi Anda dipanggil, pv arahkan ke objek kelas Anda. Parameter riid mengacu pada antarmuka yang sedang dikueri, ppv adalah penunjuk ke lokasi di mana fungsi harus menyimpan penunjuk ke antarmuka, dan dw adalah parameter yang Anda tentukan dalam entri. Fungsi harus mengatur * ppv ke NULL dan mengembalikan E_NOINTERFACE atau S_FALSE jika memilih untuk tidak mengembalikan antarmuka. Dengan E_NOINTERFACE, pemrosesan peta COM berakhir. Dengan S_FALSE, pemrosesan peta COM berlanjut, meskipun tidak ada penunjuk antarmuka yang dikembalikan. Jika fungsi mengembalikan penunjuk antarmuka, fungsi harus mengembalikan S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

Sama seperti COM_INTERFACE_ENTRY_FUNC, kecuali kueri untuk IID apa pun menghasilkan panggilan ke func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Parameter

Dw
[di] Parameter diteruskan ke func.

func
[di] Fungsi yang dipanggil ketika entri ini di peta COM diproses.

Keterangan

Kegagalan apa pun akan menyebabkan pemrosesan berlanjut pada peta COM. Jika fungsi mengembalikan penunjuk antarmuka, fungsi harus mengembalikan S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Mengembalikan E_NOINTERFACE dan mengakhiri pemrosesan peta COM saat antarmuka yang ditentukan dikueri.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Parameter

x
[di] Teks yang digunakan untuk membuat pengidentifikasi antarmuka.

Keterangan

Anda dapat menggunakan makro ini untuk mencegah antarmuka digunakan dalam kasus tertentu. Misalnya, Anda dapat menyisipkan makro ini ke peta COM tepat sebelum COM_INTERFACE_ENTRY_AGGREGATE_BLIND untuk mencegah kueri antarmuka diteruskan ke bagian dalam agregat yang tidak diketahui.

IID antarmuka akan dibangun dengan menambahkan x ke IID_. Misalnya, jika x adalah IPersistStorage, IID akan menjadi IID_IPersistStorage.