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;
}
|