0

これらの手順は私がしたことです。

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 に変更はありますか?)

この問題に関するアドバイスやコメントを残してください。

前もって感謝します。

4

1 に答える 1

0

ページのHTMLを取得するには、 outerHTMLプロパティを使用してみてください。

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"";
}
于 2013-03-20T09:06:34.530 に答える