QISearch-Funktion (shlwapi.h)
Eine tabellengesteuerte Implementierung der IUnknown::QueryInterface-Methode .
Syntax
HRESULT QISearch(
[in] void *that,
[in] LPCQITAB pqit,
[in] REFIID riid,
[out] void **ppv
);
Parameter
[in] that
Typ: void*
Ein Zeiger auf die Basis eines COM-Objekts.
[in] pqit
Typ: LPCQITAB
Ein Array von QITAB-Strukturen . Für die letzte Struktur im Array muss der piid-Member auf NULL und sein dwOffset-Element auf 0 festgelegt sein.
[in] riid
Typ: REFIID
Ein Verweis auf die IID der Schnittstelle, die über ppv abgerufen werden soll.
[out] ppv
Typ: void**
Wenn diese Methode erfolgreich zurückgegeben wird, enthält den in riid angeforderten Schnittstellenzeiger.
Rückgabewert
Typ: HRESULT
Gibt S_OK zurück, wenn die angeforderte Schnittstelle in der Tabelle gefunden wurde oder wenn die angeforderte Schnittstelle IUnknown war. Gibt E_NOINTERFACE zurück, wenn die angeforderte Schnittstelle nicht gefunden wurde.
Hinweise
Wenn QISearch das Ende der Tabelle erreicht, ohne die Schnittstelle zu finden, wird E_NOINTERFACE zurückgegeben und ppv auf NULL festgelegt.
Es ist wichtig, alle anwendbaren Schnittstellen in die Tabelle aufzunehmen. Wenn das -Objekt beispielsweise eine abgeleitete Schnittstelle implementiert, sollten Sie auch die Basisschnittstelle in die Tabelle aufnehmen.
Es wird empfohlen, das makro IID_PPV_ARGS zu verwenden, das in Objbase.h definiert ist, um die Parameter riid und ppv zu packen. Dieses Makro stellt die richtige IID basierend auf der Schnittstelle bereit, auf die der Wert in ppv verweist, wodurch die Möglichkeit eines Codierungsfehlers in riid vermieden wird, der zu unerwarteten Ergebnissen führen könnte.
Beispiele
Im folgenden Beispiel wird veranschaulicht, wie QiSearch zum Implementieren von QueryInterface verwendet wird. Es verwendet das Offsetofclass-Makro von ATL, um den Offset von der Basis des CSample-Objekts zu einer angegebenen Schnittstelle zu berechnen.
Dieses Objekt unterstützt neben IUnknown zwei Schnittstellen, sodass in der QITAB-Tabelle zwei Einträge ungleich NULL vorhanden sind. Der Eintrag für jede Schnittstelle gibt einen Zeiger auf die zugeordnete IID (IID_IPersist oder IID_IPersistFolder) und den Offset des Schnittstellenzeigers relativ zum Basiszeiger der Klasse an. Im Beispiel wird das offsetofclass-Makro aus ATL verwendet, um diesen Offset zu bestimmen.
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));
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 2000 Professional, Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows 2000 Server, Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | shlwapi.h |
Bibliothek | Shlwapi.lib |
DLL | Shlwapi.dll (Version 5.0 oder höher) |