Как получить HTML-текст через BHO, когда пользователь хочет, а не в OnDocumentComplete (выше ie8)

Эти шаги - то, что я сделал.

1) Я только что получил указатель интерфейса IWebBrowser2 от pUnkSite в SetSite, как это делает большинство bhos в обычном режиме.

2) в OnDocumentComplete, 2-1) успешно получил указатель интерфейса IHTMLDocument от IWebBrowser2. 2-2) получил HTML-текст из IHTMLDocument

я подтвердил, что эти шаги выше работали правильно.

но то, что я действительно хочу сделать, это то, что bho показывает окно сообщения, содержащее html текущей страницы всякий раз, когда пользователь хочет получить 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?)

пожалуйста, оставляйте любые советы или комментарии по этой проблеме,

заранее спасибо.

1 ответ

Попробуйте использовать свойство 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"";
}
Другие вопросы по тегам