QISearch 函数 (shlwapi.h)
IUnknown::QueryInterface 方法的表驱动实现。
语法
HRESULT QISearch(
[in] void *that,
[in] LPCQITAB pqit,
[in] REFIID riid,
[out] void **ppv
);
参数
[in] that
类型: void*
指向 COM 对象基的指针。
[in] pqit
类型: LPCQITAB
QITAB 结构的数组。 数组中的最后一个结构必须将其 piid 成员设置为 NULL ,其 dwOffset 成员设置为 0。
[in] riid
类型: REFIID
对要通过 ppv 检索的接口的 IID 的引用。
[out] ppv
类型: void**
此方法成功返回时,包含 riid 中请求的接口指针。
返回值
类型: HRESULT
如果在表中找到请求的接口或请求的接口为 IUnknown,则返回S_OK。 如果未找到请求的接口,则返回E_NOINTERFACE。
注解
如果 QISearch 到达表的末尾而未找到接口,则返回E_NOINTERFACE并将 ppv 设置为 NULL。
请务必在表中包括所有适用的接口。 例如,如果 对象实现派生接口,则还应在表中包括基接口。
建议使用 objbase.h 中定义的 IID_PPV_ARGS 宏来打包 riid 和 ppv 参数。 此宏基于 ppv 中值指向的接口提供正确的 IID,这消除了可能导致意外结果的 riid 编码错误的可能性。
示例
以下示例演示如何使用 QISearch 实现 QueryInterface。 它使用 ATL 中的 offsetofclass 宏来计算从 CSample 对象基到指定接口的偏移量。
此对象支持除 IUnknown 以外的两个接口,因此 QITAB 表中有两个非 NULL 条目。 每个接口的条目指定指向关联的 IID (IID_IPersist 或IID_IPersistFolder) 的指针,以及接口指针相对于类的基指针的偏移量。 该示例使用 ATL 中的 offsetofclass 宏来确定该偏移量。
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));
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 专业版、Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server、Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | shlwapi.h |
Library | Shlwapi.lib |
DLL | Shlwapi.dll (5.0 或更高版本) |