Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.