Funzione QISearch (shlwapi.h)
Implementazione basata su tabella del metodo IUnknown::QueryInterface .
Sintassi
HRESULT QISearch(
[in] void *that,
[in] LPCQITAB pqit,
[in] REFIID riid,
[out] void **ppv
);
Parametri
[in] that
Tipo: void*
Puntatore alla base di un oggetto COM.
[in] pqit
Tipo: LPCQITAB
Matrice di strutture QITAB . L'ultima struttura nella matrice deve avere il membro piid impostato su NULL e il membro dwOffset impostato su 0.
[in] riid
Tipo: REFIID
Riferimento all'IID dell'interfaccia da recuperare tramite ppv.
[out] ppv
Tipo: void**
Quando questo metodo restituisce correttamente, contiene il puntatore dell'interfaccia richiesto in riid.
Valore restituito
Tipo: HRESULT
Restituisce S_OK se l'interfaccia richiesta è stata trovata nella tabella o se l'interfaccia richiesta era IUnknown. Restituisce E_NOINTERFACE se l'interfaccia richiesta non è stata trovata.
Commenti
Se QISearch raggiunge la fine della tabella senza trovare l'interfaccia, restituisce E_NOINTERFACE e imposta ppv su NULL.
È importante includere tutte le interfacce applicabili nella tabella. Ad esempio, se l'oggetto implementa un'interfaccia derivata, è necessario includere anche l'interfaccia di base nella tabella.
È consigliabile usare la macro IID_PPV_ARGS definita in Objbase.h per creare il pacchetto dei parametri riid e ppv . Questa macro fornisce l'IID corretto in base all'interfaccia a cui punta il valore in ppv, che elimina la possibilità di un errore di codifica in riid che potrebbe causare risultati imprevisti.
Esempio
Nell'esempio seguente viene illustrato come usare QISearch per implementare QueryInterface. Usa la macro offsetofclass da ATL per calcolare l'offset dalla base dell'oggetto CSample a un'interfaccia specificata.
Questo oggetto supporta due interfacce a parte IUnknown, quindi sono presenti due voci non NULL nella tabella QITAB . La voce per ogni interfaccia specifica un puntatore all'IID associato (IID_IPersist o IID_IPersistFolder) e all'offset del puntatore dell'interfaccia rispetto al puntatore di base della classe. L'esempio usa la macro offsetofclass da ATL per determinare tale offset.
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));
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 2000 Professional, Windows XP [solo app desktop] |
Server minimo supportato | Windows 2000 Server, Windows Server 2003 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | shlwapi.h |
Libreria | Shlwapi.lib |
DLL | Shlwapi.dll (versione 5.0 o successiva) |