当前位置:编程学习 > C/C++ >>

使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码

答案:

使用流加载和保存HTML内容

本文的部分内容翻译自MSDN文章Loading HTML content from a Stream

IPersist* 接口,以及它的附属方法,可以被用于Microsoft® Visual C++® 和 WebBrowser 控件使用流载入和保存HTML内容

本文讨论载入HTML内容需要的步骤,分为以下几部分:

定位到 about:blank
DHTML 对象模型的有效性
使用 QueryInte易做图ce 获得IPersist*接口
使用IPersist*接口载入和保存HTML内容
载入和保存HTML元素数据
已知问题
参考
相关主题
定位到 about:blank
IWebBrowser2 接口的IWebBrowser2::Navigate2 方法 使得你可以让浏览器定位(Navigate)到一个URL。在下面的示例代码中, IWebBrowser2::Navigate2 方法 被用于定位到 about:blank 页面. 定位到这个空的页面确保了MSHTML 被加载,并且动态 HTML (DHTML) 对象模型中的 HTML 元素有效.

本示例演示了如何让浏览器定位到一个空的页面。m_pBrowser 变量包含从WebBrowser 控件获得的 IWebBrowser2 接口指针。

m_pBrowser->Navigate2( _T("about:blank"), NULL, NULL, NULL, NULL );
DHTML 对象模型的有效性
DHTML 对象模型 用于访问和操作HTML页面的内容,并且在页面装载之前不可用。你的应用程序通过处理WebBrowser 控件的DWebBrowserEvents2::DocumentComplete事件来判断一个页面是否被装载了。 这个事件可能被页面中的每个框架触发,并且在顶层文档载入完成时再触发一次。你可以通过比较事件传递的IDispatch 接口指针和WebBrowser 控件来判断DWebBrowserEvents2::DocumentComplete 事件是否是顶层框架的。

这个WebBrowser DWebBrowserEvents2::DocumentComplete 事件的示例处理代码演示如何判断事件是否是顶层框架的, (如果是,)这指明HTML页面载入完成. 本示例也演示如何从一个内存块——在这个场合是一个包含需要显示的HTML内容的字符串——创建流。

void myObject::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
    HRESULT hr;
    IUnknown* pUnkBrowser = NULL;
    IUnknown* pUnkDisp = NULL;
    IStream* pStream = NULL;
    HGLOBAL hHTMLText;
    static TCHAR szHTMLText[] = "<html><h1>流测试</h1><p>本HTML内容已经从流中加载。</html>";
    // 这个 DocumentComplete 事件是否是顶层框架窗口的?
    // 检查 COM 标识: 比较IUnknown 接口指针.
    hr = m_pBrowser->QueryInte易做图ce( IID_IUnknown,  (void**)&pUnkBrowser );
    if ( SUCCEEDED(hr) )
    {
        hr = pDisp->QueryInte易做图ce( IID_IUnknown,  (void**)&pUnkDisp );
        if ( SUCCEEDED(hr) )
        {
            if ( pUnkBrowser == pUnkDisp )
            {   // 这是顶层框架窗口的DocumentComplete 事件 —— 页面 载入完成!
                // 建立一个包含HTML内容的流
                // 另外, 这个流可以是被传递过来的(而不是被创建的)
  
                size_t = cchLength;
                //  TODO: 安全地判断 szHTMLText的长度,单位是TCHAR.
                hHTMLText = GlobalAlloc( GPTR, cchLength+1 );
   
                if ( hHTMLText )
                {
                    size_t cchMax = 256;
                    StringCchCopy((TCHAR*)hHTMLText, cchMax + 1, szHTMLText);
                    //  TODO: 在这里加入错误处理代码。
                    hr = CreateStreamOnHGlobal( hHTMLText, TRUE, &pStream );
                    if ( SUCCEEDED(hr) )
                    {
                       // 调用辅助函数让网络浏览器加载流。
                       LoadWebBrowserFromStream( m_pBrowser, pStream  );
                       pStream->Release();
                    }
                    GlobalFree( hHTMLText );
                }
            }
            pUnkDisp->Release();
        }
        pUnkBrowser->Release();
    }
}
使用 QueryInte易做图ce 获得IPersis*等接口
WebBrowser 控件的IWebBrowser2::get_Document 属性返回表示顶层框架的DHTML 对象模型的文档对象。MSHTML 通过文档对象和其他HTML元素对象,例如Frame, IFrame等等实现的IPersistStreamInit,IPersistFile等接口提供使用流载入和保存HTML的功能。对象的IDispatch 接口可用于通过使用QueryInte易做图ce和IID_IPersistStreamInit 等接口标识查询相应接口指针,如下列代码示例所述.

HRESULT LoadWebBrowserFromStream(IWebBrowser2* pWebBrowser, IStream* pStream)
{
HRESULT hr;
IDispatch* pHtmlDoc = NULL;
IPersistStreamInit* pPersistStreamInit = NULL;
    // 返回文档对象.
    hr = pWebBrowser->get_Document( &pHtmlDoc );
    if ( SUCCEEDED(hr) )
    {
        // >查询 IPersistStreamInit接口
        hr = pHtmlDoc->QueryInte易做图ce( IID_IPersistStreamInit,  (void**)&pPersistStreamInit );
        if ( SUCCEEDED(hr) )
        {
            // 初始化文档.
            hr = pPersistStreamInit->InitNew();
            if ( SUCCEEDED(hr) )
            {
                // 载入流内容
                hr = pPersistStreamInit->Load( pStream );
            }
            pPersistStreamInit->Release();
        }
    }
}
使用IPersist*接口载入和保存HTML内容
IPersistStreamInit 接口具有用于从流初始化和载入HTML内容的InitNew 和Load 方法以及用于保存的Save方法。InitNew 方法初始化流到一个已知状态,

上一个:使用MFC编写internet查询程序
下一个:TELNET协议规范

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,