Реализация QueryInterface().

Функция 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;
}

						


Hosted by uCoz