これらの手順は私がしたことです。
1) ほとんどの bho が通常行うように、SetSite の pUnkSite から IWebBrowser2 インターフェイス ポインターを取得しました。
2) OnDocumentComplete で、2-1) IWebBrowser2 から IHTMLDocument インターフェイス ポインターを正常に取得しました。2-2) IHTMLDocument から html テキストを取得
上記の手順が正しく機能することを確認しました。
しかし、私が本当にやりたいことは、ユーザーがhtmlテキストを取得したいときはいつでも、bhoが現在のページのhtmlを含むメッセージボックスを表示することです(たとえば、ユーザーが「htmlを取得」ボタンをクリックします)。
そのため、ユーザーが「get 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 に変更はありますか?)
この問題に関するアドバイスやコメントを残してください。
前もって感謝します。