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 に答える