我们在获取IE URL Chain的时候, 可以根据Web Browser之间的关系去获得Parent Window从而组成完整的Chain。
std::wstring IEWebBrowserHelper::GetParentURLFromWebBrowser(CComQIPtr<IWebBrowser2>& web_browser2) {
std::wstring parent_url;
HRESULT hr = S_OK;
CComPtr<IDispatch> pDisp;
hr = web_browser2->get_Document(&pDisp);
if (FAILED(hr)) {
//BW_LOG("Fail Get Document");
return parent_url;
}
CComQIPtr<IHTMLDocument2> pDoc2 = pDisp;
if (NULL == pDoc2) {
//BW_LOG("Fail Query Document");
return parent_url;
}
CComQIPtr<IHTMLWindow2> pParentWindow2;
hr = pDoc2->get_parentWindow(&pParentWindow2);
if (FAILED(hr) || NULL == pParentWindow2) {
//BW_LOG("Fail Get Parent Window");
return parent_url;
}
CComQIPtr<IHTMLWindow2> pParentWindow2_A;
hr = pParentWindow2->get_parent(&pParentWindow2_A);
if (FAILED(hr) || NULL == pParentWindow2_A) {
//BW_LOG("Fail Get Parent Window A");
return parent_url;
}
CComQIPtr<IServiceProvider> spServiceProvider = pParentWindow2_A;
if (NULL == spServiceProvider) {
//return CComQIPtr<IWebBrowser2>();
return parent_url;
}
CComQIPtr<IWebBrowser2> pParentWebBrowser2;
hr = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pParentWebBrowser2);
//return spWebBrws;
if(FAILED(hr) || NULL == pParentWebBrowser2) {
return parent_url;
}
CComPtr<IDispatch> pParentDocDisp;
hr = pParentWebBrowser2->get_Document(&pParentDocDisp);
if (FAILED(hr) || NULL == pParentDocDisp) {
//BW_LOG("Fail Get Parent Document");
return parent_url;
}
//
CComQIPtr<IHTMLDocument2> pParentDoc2 = pParentDocDisp;
if (NULL == pParentDoc2) {
//BW_LOG("Fail Query Document");
return parent_url;
}
CComBSTR bstrParentUrl;
pParentDoc2->get_URL(&bstrParentUrl);
parent_url = bstrParentUrl;
return parent_url;
}