这些步骤就是我所做的。
1)我刚刚从SetSite中的pUnkSite获得了IWebBrowser2接口指针,就像大多数bhos一样。
2)在OnDocumentComplete中, 2-1)从IWebBrowser2成功获得IHTMLDocument接口指针。 2-2)从IHTMLDocument获取html文本
我确认上述步骤正常工作。
但我真正想做的是,当用户想要获取html文本时,bho会显示包含当前页面html的消息框(例如,用户点击“获取html”按钮)。
所以,当用户点击“获取html”按钮时,我写了一个函数来执行此操作,如下所示。
void CBHO::ClickedOnGetHtml()
{
CComPtr<IDispatch> spDispDoc;
HRESULT hr = m_spWebBrowser->get_Document(&spDispDoc); // m_spWebBrowser from SetSite
if (SUCCEEDED(hr))
{
CComQIPtr<IHTMLDocument2> spHtmlDoc;
spHtmlDoc = spDispDoc;
CComPtr<IDispatch> spDisp;
spHtmlDoc->get_Script(&spDisp); <- exception occured here in ie8. (worked correctly in ie6, but not in ie8.)
}
}
这是发生异常时的调用堆栈。
mshtml.dll!GetCurrentServiceProvider() + 0xc bytes
mshtml.dll!GetCallerCommandTarget() + 0xa6 bytes
mshtml.dll!COmWindowProxy::SecureObject() - 0x600c5 bytes
mshtml.dll!CDocument::get_Script() + 0x9c bytes
BHO.dll!CBHO::ClickedOnGetHtml() line 37 + 0x2d bytes C++
更有趣的是它在ie6中正常工作,但在ie8中没有工作。 (ie8与ie6相比有什么变化吗?)
请就此问题留下任何建议或意见,
提前感谢。
答案 0 :(得分:0)
尝试使用outerHTML属性来获取页面HTML:
CString GetOuterHTML(IWebBrowser2* pWebBrowser)
{
CComDispatchDriver pDocDisp;
if(SUCCEEDED(pWebBrowser->get_Document(&pDocDisp)) && pDocDisp != NULL)
{
CComQIPtr<IHTMLDocument3> pDoc3 = pDocDisp;
if(pDoc3 != NULL)
{
CComPtr<IHTMLElement> pRootElem;
if(SUCCEEDED(pDoc3->get_documentElement(&pRootElem)) && pRootElem != NULL)
{
CComBSTR bstrText;
if(SUCCEEDED(pRootElem->get_outerHTML(&bstrText)))
{
return bstrText;
}
}
}
}
return L"";
}