Fungsi QISearch (shlwapi.h)
Implementasi berbasis tabel dari metode IUnknown::QueryInterface .
Sintaks
HRESULT QISearch(
[in] void *that,
[in] LPCQITAB pqit,
[in] REFIID riid,
[out] void **ppv
);
Parameter
[in] that
Jenis: void*
Penunjuk ke dasar objek COM.
[in] pqit
Jenis: LPCQITAB
Array struktur QITAB . Struktur terakhir dalam array harus mengatur anggota piid-nya ke NULL dan anggota dwOffset-nya diatur ke 0.
[in] riid
Jenis: REFIID
Referensi ke IID antarmuka untuk diambil melalui ppv.
[out] ppv
Jenis: void**
Ketika metode ini berhasil dikembalikan, berisi pointer antarmuka yang diminta dalam riid.
Nilai kembali
Jenis: HRESULT
Mengembalikan S_OK jika antarmuka yang diminta ditemukan dalam tabel atau jika antarmuka yang diminta adalah IUnknown. Mengembalikan E_NOINTERFACE jika antarmuka yang diminta tidak ditemukan.
Keterangan
Jika QISearch mencapai akhir tabel tanpa menemukan antarmuka, QISearch mengembalikan E_NOINTERFACE dan mengatur ppv ke NULL.
Penting untuk menyertakan semua antarmuka yang berlaku dalam tabel. Misalnya, jika objek mengimplementasikan antarmuka turunan, Anda juga harus menyertakan antarmuka dasar dalam tabel.
Kami menyarankan agar Anda menggunakan makro IID_PPV_ARGS , yang ditentukan dalam Objbase.h, untuk mengemas parameter riid dan ppv . Makro ini menyediakan IID yang benar berdasarkan antarmuka yang ditunjukkan oleh nilai dalam ppv, yang menghilangkan kemungkinan kesalahan pengkodian dalam riid yang dapat menyebabkan hasil yang tidak terduga.
Contoh
Contoh berikut menggambarkan cara menggunakan QISearch untuk mengimplementasikan QueryInterface. Ini menggunakan makro offsetofclass dari ATL untuk menghitung offset dari dasar objek CSample ke antarmuka yang ditentukan.
Objek ini mendukung dua antarmuka selain IUnknown, sehingga ada dua entri non-NULL dalam tabel QITAB . Entri untuk setiap antarmuka menentukan penunjuk ke IID terkait (IID_IPersist atau IID_IPersistFolder) dan offset penunjuk antarmuka relatif terhadap penunjuk dasar kelas. Sampel menggunakan makro offsetofclass dari ATL untuk menentukan offset tersebut.
class CSample : public IPersistFolder
{
public:
CSample() { /* other construction goes here */ }
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// *** IPersist ***
STDMETHODIMP GetClassID(CLSID *pClassID);
// *** IPersistFolder ***
STDMETHODIMP Initialize(LPCITEMIDLIST pidl);
private:
// private members go here
};
HRESULT CSample::QueryInterface(REFIID riid, void **ppv)
{
static QITAB rgqit[] =
{
QITABENT(CSample, IPersist),
QITABENT(CSample, IPersistFolder)
{ 0 },
};
return QISearch(this, rgqit, IID_PPV_ARGS(&ppv));
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows 2000 Professional, Windows XP [hanya aplikasi desktop] |
Server minimum yang didukung | Windows 2000 Server, Windows Server 2003 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | shlwapi.h |
Pustaka | Shlwapi.lib |
DLL | Shlwapi.dll (versi 5.0 atau yang lebih baru) |