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 Professional, Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows 2000 Server, Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | shlwapi.h |
라이브러리 | Shlwapi.lib |
DLL | Shlwapi.dll(버전 5.0 이상) |