Функция QueryInterface() служит для передачи компонентом
клиенту указателя на интерфейс. Эта функция имеет два параметра :
virtual HRESULT __stdcall QueryInterface(const IID& iid,void** ppv). Первый
параметр - идентификатор интерфейса. Второй параметр - адрес, по которому
передается указатель на интерфейс. Функция QueryInterface()
может быть реализована примерно следующим образом.
interface IMyInterface1 : IUnknown
{
virtual void __stdcall Fa1();
virtual void __stdcall Fa2();
}
interface IMyInterface2 : IUnknown
{
virtual void __stdcall Fb1();
virtual void __stdcall Fb2();
}
class CMyComObject : public IMyInterface1,
public IMyInterface2
{
virtual HRESULT __stdcall QueryInterface(const IID& iid,void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
virtual void __stdcall Fa1();
virtual void __stdcall Fa2();
virtual void __stdcall Fb1();
virtual void __stdcall Fb2();
}
HRESULT __stdcall CMyComObject::QueryInterface(const IID& iid,
void** ppv)
{
if(iid=IID_IUnknown)
{
*ppv=(IUnknown*)this;
}
if(iid==IID_IMyInterface1)
{
*ppv=(IMyInterface1*)this;
}
if(iid==IID_IMyInterface2)
{
*ppv=(IMyInterface2*)this;
}
if(*ppv)
{
(IUnknown*)(*ppv))->AddRef();
return S_OK;
}
*ppv=NULL;
return E_NOINTERFACE;
}
|