IHTMLDocument2可以打开一个本地HTML文件, 并取得所有图片SRC属性吗? BSTR url = SysAllocString(L"c:\\zzz.html");
VARIANT name;
BSTR bstr_name = SysAllocString(OLESTR("_blank"));
name.vt = VT_BSTR;
name.bstrVal = bstr_name;
VARIANT feature;
BSTR str_feature = SysAllocString(OLESTR("channelmode = {yes|1}, directories = {yes|1},height = 150, left = 800, location = {no}, menubar = {no|0}, resizable = {no|0}, scrollbars = {no}, status = {no}, titlebar = {no}, toolbar = {no|0}, top = 500, width = 150"));
feature.vt = VT_BSTR;
feature.bstrVal = str_feature;
VARIANT replaces;
BSTR str_rep = SysAllocString(OLESTR("true"));
replaces.vt = VT_BSTR;
replaces.bstrVal = str_rep;
IDispatch *newDispatch; hr = pDoc->open(url, name, feature, replaces, &newDispatch);
if (hr != S_OK)
AfxMessageBox("error hr");  执行显示: error hr.能打开本地html文件吗?如果此技术不行, 有本地html的解析类吗?

解决方案 »

  1.   

    本帖最后由 jiangsheng 于 2012-10-25 04:10:07 编辑
      

  2.   

      // 取得对所有元素集合的引用
      if (SUCCEEDED(hr = m_pMSHTML->get_all( &pColl ))) {
        long cElems;    assert(pColl);    // 个数
        if (SUCCEEDED(hr = pColl->get_length( &cElems ))) {
          std::cout << "element counts: " << cElems << std::endl;
          // 访问每个元素的属性, 比如 TAGNAME and HREF
          for ( int i = 0; i < cElems; i++ ) {
            VARIANT vIndex;
            vIndex.vt = VT_UINT;
            vIndex.lVal = i;
            VARIANT var2 = { 0 };
            LPDISPATCH pDisp;        if (SUCCEEDED(hr = pColl->item( vIndex, var2, &pDisp ))) {
              IHTMLElement* pElem = NULL;
              if (SUCCEEDED(hr = pDisp->QueryInterface( IID_IHTMLElement, (LPVOID*)&pElem ))) {
                _bstr_t bstrTag;
                BSTR bstr;            assert(pElem);            hr = pElem->get_tagName(&bstr);
                if (bstr) {
                  bstrTag = bstr;
                  SysFreeString(bstr);
                }            // 如果是 <IMG> 元素, 获取其 SRC 属性
                IHTMLImgElement* pImage = NULL;
                if (SUCCEEDED(hr = pDisp->QueryInterface( IID_IHTMLImgElement, (LPVOID*)&pImage ))) {
                  assert(pImage);              pImage->get_src(&bstr);
                  if (bstr) {
                    bstrTag += " - ";
                    bstrTag += bstr;
                    SysFreeString(bstr);
                  }
                  pImage->Release();
                }            PrintBSTR(bstrTag);            pElem->Release();
              } // QI(IHTMLElement)
              pDisp->Release();
            } // item
          } // for
        } // get_length    pColl->Release();
      } // get_all
      

  3.   

    mshtml 的几种 load
    HRESULT
    CHtmlDOM::loadFromMoniker(LPCTSTR szUrl)
    {
      if (!m_pDisp)
        return S_FALSE;  HRESULT hr;  CSmartPtr<IMoniker> pMk;
      if (SUCCEEDED(hr = CreateURLMoniker(NULL, szUrl, &pMk))) {
        CSmartPtr<IBindCtx> pBCtx;
        if (SUCCEEDED(hr = CreateBindCtx(0, &pBCtx))) {
          // Use MSHTML moniker services to load the specified document
          CSmartPtr<IPersistMoniker> pPMk;
          if (SUCCEEDED(hr = m_pDisp->QueryInterface(IID_IPersistMoniker, (LPVOID*)&pPMk))) {
            // Call Load on the IPersistMoniker
            // 这里调用后立马返回, 文档此时仍未加载完毕
            // 需要等到 MSHTML 报告 READYSTATE_COMPLETE 时刻.
            // 查看 Site 实现上的 IPropertyNotifySink::OnChanged 函数
            hr = pPMk->Load(FALSE, pMk, pBCtx, STGM_READ);
          }
        }
      }
      return hr;
    }// 传统的持久化方式.
    // MSHTML 也是使用异步加载的方式.HRESULT
    CHtmlDOM::loadFromFile(LPCTSTR szUrl)
    {
      if (!m_pDisp)
        return S_FALSE;  HRESULT hr;
      CSmartPtr<IPersistFile> pPF;
      // MSHTML 支持常规文件持久化.
      if ( SUCCEEDED(hr = m_pDisp->QueryInterface(IID_IPersistFile, (LPVOID*) &pPF))) {
        hr = pPF->Load(szUrl, 0);
      }  return hr;
    }// 流接口的加载
    //HRESULT
    CHtmlDOM::loadFromStream(IStream* pStream)
    {
      if (!m_pDisp)
        return S_FALSE;  HRESULT hr = S_OK;
      CSmartPtr<IPersistStreamInit> pPSI;
      //The IPersistStreamInit interface has InitNew and Load methods
      //that are used to initialize and load an HTML document from a stream.
      //The InitNew method initializes the stream to a known state
      //and the Load method loads the HTML content from the stream.
      if ( SUCCEEDED( hr = m_pDisp->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&pPSI) )) {
        hr = pPSI->InitNew();
        hr = pPSI->Load(pStream);
      }
      return hr;
    }
      

  4.   

    void CgfgfDlg::OnBnClickedButton2()
    {
    // TODO: 在此添加控件通知处理程序代码
    HRESULT hr;  
    hr = CoInitialize(NULL); CComPtr<IPersistFile> pFile;
    pFile.CoCreateInstance(CLSID_HTMLDocument);
    if(pFile)
    {
    pFile->Load(L"c:\\zzz2.html",STGM_READ);
    CComQIPtr<IHTMLDocument2> m_pMSHTML(pFile); IHTMLElementCollection* pColl = NULL;
    if (SUCCEEDED(hr = m_pMSHTML->get_all( &pColl )))
    {
    long cElems; ASSERT(pColl); // retrieve the count of elements in the collection
    if (SUCCEEDED(hr = pColl->get_length( &cElems )))
    {
                                    }
    } // get_all
    }
    }
    我把程序放在了一个OnButton中
    但if (SUCCEEDED(hr = pColl->get_length( &cElems ))) 
    虽然成功了, 但cElems 总为0, 知道为什么?用的vs2008.