这些步骤是我所做的。
1)我刚刚从 SetSite 中的 pUnkSite 获得了 IWebBrowser2 接口指针,就像大多数 bhos 通常所做的那样。
2) 在 OnDocumentComplete 中,2-1) 从 IWebBrowser2 成功获得 IHTMLDocument 接口指针。2-2) 从 IHTMLDocument 获取 html 文本
我确认上述这些步骤工作正常。
但我真正想做的是,只要用户想要获取 html 文本(例如,用户单击“获取 html”按钮),bho 就会显示包含当前页面的 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 中不能正常工作。(与 ie6 相比,ie8 有什么变化吗?)
请留下任何关于这个问题的建议或意见,
提前致谢。