Aturan untuk Menerapkan QueryInterface
Ada tiga aturan utama yang mengatur penerapan metode IUnknown::QueryInterface pada objek COM:
- Objek harus memiliki identitas.
- Kumpulan antarmuka pada instans objek harus statis.
- Dimungkinkan untuk mengkueri dengan sukses untuk antarmuka apa pun pada objek dari antarmuka lain.
Objek Harus Memiliki Identitas
Untuk instans objek tertentu, panggilan ke QueryInterface dengan IID_IUnknown harus selalu mengembalikan nilai penunjuk fisik yang sama. Ini memungkinkan Anda untuk memanggil QueryInterface pada dua antarmuka apa pun dan membandingkan hasilnya untuk menentukan apakah mereka menunjuk ke instans objek yang sama.
Set Antarmuka pada Instans Objek Harus Statis
Set antarmuka yang dapat diakses pada objek melalui QueryInterface harus statis, bukan dinamis. Secara khusus, jika QueryInterface mengembalikan S_OK untuk IID tertentu sekali, itu tidak boleh mengembalikan E_NOINTERFACE pada panggilan berikutnya pada objek yang sama; dan jika QueryInterface mengembalikan E_NOINTERFACE untuk IID tertentu, panggilan berikutnya untuk IID yang sama pada objek yang sama tidak boleh mengembalikan S_OK.
Harus Dimungkinkan untuk Mengkueri Dengan Sukses untuk Antarmuka Apa Pun pada Objek dari Antarmuka Lain
Artinya, diberikan kode berikut:
IA * pA = (some function returning an IA *);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB, &pB);
aturan berikut berlaku:
Jika Anda memiliki penunjuk ke antarmuka pada objek, panggilan seperti berikut ini ke QueryInterface untuk antarmuka yang sama harus berhasil:
pA->QueryInterface(IID_IA, ...)
Jika panggilan ke QueryInterface untuk penunjuk antarmuka kedua berhasil, panggilan ke QueryInterface dari penunjuk tersebut untuk antarmuka pertama juga harus berhasil. Jika pB berhasil diperoleh, berikut ini juga harus berhasil:
pB->QueryInterface(IID_IA, ...)
Antarmuka apa pun harus dapat mengkueri antarmuka lain pada objek. Jika pB berhasil diperoleh dan Anda berhasil mengkueri antarmuka ketiga (IC) menggunakan pointer tersebut, Anda juga harus dapat membuat kueri dengan sukses untuk IC menggunakan pointer pertama, pA. Dalam hal ini, urutan berikut harus berhasil:
IC * pC = NULL; hr = pB->QueryInterface(IID_IC, &pC); pA->QueryInterface(IID_IC, ...)
Implementasi antarmuka harus mempertahankan penghitung referensi pointer yang luar biasa ke semua antarmuka pada objek tertentu. Anda harus menggunakan bilangan bulat yang tidak ditandatangani untuk penghitung.
Jika klien perlu tahu bahwa sumber daya telah dibebaskan, itu harus menggunakan metode di beberapa antarmuka pada objek dengan semantik tingkat yang lebih tinggi sebelum memanggil IUnknown::Release.
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk