转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234
欢迎大家拍砖
IUnknown::QueryInterface 方法牟表驱动的执行方法
HRESULT QISearch(
_In_ void *that,
_In_ LPCQITAB pqit,
_In_ REFIID riid,
_Out_ void **ppv
);
Parameters
-
that [in]
-
Type: void*
一个基本COM对象的指针.
pqit [in]
-
Type: LPCQITAB
一个 QITAB 结构体的数组. 数组最后的结构体必须设置为NULL,且dwOffset成员设置为0。
riid [in]
-
Type: REFIID
接口IID的引用,由调用者获得
ppv [out]
-
Type: void**
当此方法成功返回时,此变量包含riid要求的接口指针。
-
Remarks
-
在vista之前的版本号,QISearch不能使用。
-
而如果要使用,那么得从Shlwapi.dll中通过GetProcessAddress方法获得219,且QISearch被包含在Shlwapi.h中。
-
如果被要求的接口是IUnknown,那么QISearch用指定数据QITAB结构体中的第一个入口。否则QISearch搜索表,一直到它发现符合的IID。
-
如果一个符合的IID被找到,那么它通过接口表QITAB结构体中的dwOffset指定绑定的接口指针,且重新解决为COM指针。此指针被分配在QISearch函数的ppv参数中。
-
此方法也调用IUnknown::AddRef来增加接口的相关计数。
-
例子:
-
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)); }
Requirements
Minimum supported client
Windows 2000 Professional, Windows XP Minimum supported server
Windows 2000 Server, Windows Server 2003 Header
-
Shlwapi.h
Library
-
Shlwapi.lib
DLL
-
Shlwapi.dll (version 5.0 or later)