웹, HTML

Internet Explorer COM Interfaces 관계 도식화

디버그정 2008. 9. 10. 21:07
Internet Explorer COM Interfaces Relationship
조회(321)
Internet Explorer | 2007/07/04 (수) 10:46
추천하기 | 스크랩하기
KeyloggerMore30.jpg
IHTMLDocument2에서 IWebBrowser2를 얻는 방법은 IServiceProvider를 QueryInterface로 얻은후에 QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pWeb2) 로 얻을 수 있다. 즉 그림이 틀리다는 얘기다.
IHTMLDocument2에서 최상위 IWebBrowser2를 얻는 함수

IWebBrowser2*  GetIWebBrowser2(IHTMLDocument2* pDoc)
{
 if(NULL == pDoc) return NULL;

 HRESULT hr;

 IHTMLWindow2 *pWin = NULL;
 hr = pDoc->get_parentWindow(&pWin);
 if(SUCCEEDED(hr) && pWin)
 {
  IHTMLWindow2 *pParentWin = NULL;

  while(SUCCEEDED(pWin->get_parent(&pParentWin)))
  {
   if(pParentWin)
   {
    if(pWin == pParentWin)
    {
     pParentWin->Release();
     break;
    }

    pWin->Release();
    pWin = pParentWin;
   }
  }

  IServiceProvider *pSP = NULL;
  hr = pWin->QueryInterface(IID_IServiceProvider, (void **)&pSP);
  pWin->Release();

  if(SUCCEEDED(hr) && pSP)
  {
   IWebBrowser2 *pWeb = NULL;
   hr = pSP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&pWeb);
   pSP->Release();
   
   if(SUCCEEDED(hr) && pWeb)
   {
    return pWeb;
   }
  }
 }

 return NULL;
}