Bagikan melalui


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.

Menggunakan dan Menerapkan IUnknown