1

我正在开发一个使用 CHtmlView 的应用程序。新要求意味着我希望能够从类中获取 HTML 源以解析特定标签(或者如果可能的话,只需获取标签中的信息)。如果我们使用较新的系统,这会很好,我可以使用 CHtmlView::GetSource 但它不存在。

我在网上进行了相当广泛的搜索,但对大多数 Windows 编程来说还是很陌生,还没有实现任何有用的东西。

因此,如果有人有一个如何在不使用 GetSource 的情况下从 CHtmlView 中提取 HTML 的示例,我将不胜感激。我试过了

    BSTR bstr;
    _bstr_t * bstrContainer;
HRESULT hr;
IHTMLDocument2 * pDoc;
IDispatch * pDocDisp = NULL;
pDocDisp = this->GetHtmlDocument();
if (pDocDisp != NULL) {
    hr = pDocDisp->QueryInterface (IID_IHTMLDocument2, (void**)&pDoc);
    if (SUCCEEDED(hr)) {
        if (pDoc->toString(&bstr) != S_OK) {
                         //error...
        } else {
            bstrContainer = new _bstr_t(bstr);
            size = (bstrContainer->length()+1)*2;
            realString = new char[size];
            strncpy(realString, (char*)(*bstrContainer), size);
        }
    } else {
        //error
    }
    pDocDisp->Release();
}

但它主要只是在 realString 中给了我“[object]”。就像我说的,Windows 新手。

任何帮助表示赞赏。

4

1 回答 1

0

将此辅助函数添加到您的 CHtmlView 派生类中以检索 html 源代码。请记住检查此函数返回的布尔状态,因为当系统资源不足时,com-interface 可能非常不可靠。

 /* ============================================== */
BOOL CTest1View::GetHtmlText(CString &strHtmlText) 
{
    BOOL bState = FALSE;
    // get IDispatch interface of the active document object
    IDispatch *pDisp = this->GetHtmlDocument();
    if (pDisp != NULL) 
    {   // get the IHTMLDocument3 interface
        IHTMLDocument3 *pDoc = NULL;
        HRESULT hr = pDisp->QueryInterface(IID_IHTMLDocument3, (void**) &pDoc);
        if (SUCCEEDED(hr))
        {   // get root element
            IHTMLElement *pRootElement = NULL;
            hr = pDoc->get_documentElement(&pRootElement);
            if (SUCCEEDED(hr))
            {   // get html text into bstr
                BSTR bstrHtmlText;
                hr = pRootElement->get_outerHTML(&bstrHtmlText);
                if (SUCCEEDED(hr))
                {   // convert bstr to CString
                    strHtmlText = bstrHtmlText;
                    bState = TRUE;
                    SysFreeString(bstrHtmlText);
                }
                pRootElement->Release();
            }
            pDoc->Release();
        }
        pDisp->Release();
    }
    return bState;
}
于 2013-02-06T06:42:10.520 回答