Meminta Objek untuk Antarmuka

Kita melihat sebelumnya bahwa objek dapat mengimplementasikan lebih dari satu antarmuka. Objek Dialog Item Umum adalah contoh dunia nyata dari ini. Untuk mendukung penggunaan yang paling umum, objek mengimplementasikan antarmuka IFileOpenDialog . Antarmuka ini menentukan metode dasar untuk menampilkan kotak dialog dan mendapatkan informasi tentang file yang dipilih. Namun, untuk penggunaan yang lebih canggih, objek juga mengimplementasikan antarmuka bernama IFileDialogCustomize. Program dapat menggunakan antarmuka ini untuk menyesuaikan tampilan dan perilaku kotak dialog, dengan menambahkan kontrol UI baru.

Ingat bahwa setiap antarmuka COM harus mewarisi, secara langsung atau tidak langsung, dari antarmuka IUnknown . Diagram berikut menunjukkan pewarisan objek Dialog Item Umum.

diagram yang memperlihatkan antarmuka yang diekspos oleh objek dialog item umum

Seperti yang Anda lihat dari diagram, nenek moyang langsung IFileOpenDialog adalah antarmuka IFileDialog , yang pada gilirannya mewarisi IModalWindow. Saat Anda naik rantai pewarisan dari IFileOpenDialog ke IModalWindow, antarmuka menentukan fungsionalitas jendela yang semakin umum. Akhirnya, antarmuka IModalWindow mewarisi IUnknown. Objek Dialog Item Umum juga mengimplementasikan IFileDialogCustomize, yang ada dalam rantai pewarisan terpisah.

Sekarang misalkan Anda memiliki penunjuk ke antarmuka IFileOpenDialog . Bagaimana Anda akan mendapatkan penunjuk ke antarmuka IFileDialogCustomize ?

diagram yang memperlihatkan dua penunjuk antarmuka ke antarmuka pada objek yang sama

Cukup transmisikan penunjuk IFileOpenDialog ke penunjuk IFileDialogCustomize tidak akan berfungsi. Tidak ada cara yang dapat diandalkan untuk "cross cast" di seluruh hierarki pewarisan, tanpa beberapa bentuk informasi jenis run-time (RTTI), yang merupakan fitur yang sangat bergantung pada bahasa.

Pendekatan COM adalah meminta objek untuk memberi Anda penunjuk IFileDialogCustomize , menggunakan antarmuka pertama sebagai saluran ke dalam objek. Ini dilakukan dengan memanggil metode IUnknown::QueryInterface dari penunjuk antarmuka pertama. Anda dapat menganggap QueryInterface sebagai versi independen bahasa dari kata kunci dynamic_cast di C++.

Metode QueryInterface memiliki tanda tangan berikut:

HRESULT QueryInterface(REFIID riid, void **ppvObject);

Berdasarkan apa yang sudah Anda ketahui tentang CoCreateInstance, Anda mungkin dapat menebak cara kerja QueryInterface .

  • Parameter riid adalah GUID yang mengidentifikasi antarmuka yang Anda minta. Jenis data REFIID adalah typedef untuk const GUID&. Perhatikan bahwa pengidentifikasi kelas (CLSID) tidak diperlukan, karena objek telah dibuat. Hanya pengidentifikasi antarmuka yang diperlukan.
  • Parameter ppvObject menerima penunjuk ke antarmuka. Jenis data parameter ini batal**, karena alasan yang sama bahwa CoCreateInstance menggunakan jenis data ini: QueryInterface dapat digunakan untuk mengkueri antarmuka COM apa pun, sehingga parameter tidak dapat diketik dengan kuat.

Berikut adalah cara Anda memanggil QueryInterface untuk mendapatkan penunjuk IFileDialogCustomize :

hr = pFileOpen->QueryInterface(IID_IFileDialogCustomize, 
    reinterpret_cast<void**>(&pCustom));
if (SUCCEEDED(hr))
{
    // Use the interface. (Not shown.)
    // ...

    pCustom->Release();
}
else
{
    // Handle the error.
}

Seperti biasa, periksa nilai pengembalian HRESULT , jika metode gagal. Jika metode berhasil, Anda harus memanggil Rilis setelah selesai menggunakan penunjuk, seperti yang dijelaskan dalam Mengelola Masa Pakai Objek.

Berikutnya

Alokasi Memori di COM