国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

兩種方法訪問多層嵌套的frame

2024-07-21 02:29:33
字體:
供稿:網(wǎng)友

========================================

在您的網(wǎng)站拜讀了關(guān)于twebbrowser的使用方法,但是一直有一個問題困擾我,就是如何取得frame嵌套frame的html的原碼,我只是知道單個frame如何取得源碼,但是多個frame嵌套就沒有辦法,請教一下!

答========================================

要得到源代碼,必須先得到frame。訪問frame一般說來有兩種方法:

  1、通過webbrowser的文檔接口得到frame的集合,再逐一訪問。

hresult ihtmldocument2::get_frames(ihtmlframescollection2 **p);

  由ihtmlframescollection2接口的item方法,可以以frame的索引號(從0開始)或frame的名稱來訪問相應(yīng)的frame,pvarresult則返回一個idispatch接口(或一個idispatch接口的數(shù)組,多層嵌套的情況).

hresult item(         
    variant *pvarindex,
    variant *pvarresult
);

  例子如下,假設(shè)pwin是一個指向主窗口的有效的ihtmlwindow接口指針。

......
variant framerequested;
variant frameout;
ihtmlframescollection2* pframescol;
ihtmlwindow2* prightframewindow;
ihtmldocument2* prightdoc;

framerequested.vt = vt_bstr;//若為vt_i4則以索引號來訪問
framerequested.bstrval = l"rightframe";//以名稱來訪問
//framerequested.vt = vt_i4;
//framerequested.bstrval = (bstr)0;

hr = pwin->get_frames(&pframescol);
hr = pframescol->item(&framerequested, &frameout);
  
hr = frameout.pdispval->queryinterface(iid_ihtmlwindow2, (void**)&prightframewindow);
hr = prightframewindow->get_document(&prightdoc);
......

  2、通過iolecontainer枚舉嵌入對象的方式來訪問webbrowser對象。

void cmyhtmlview::refreshframes()
{
  // 取得文檔的idispatch指針
  lpdispatch lpdisp = null;
  lpdisp = gethtmldocument();

  if (lpdisp)
  {
    iolecontainer* pcontainer;
    hresult hr = lpdisp->queryinterface(iid_iolecontainer, (void**)&pcontainer);
    lpdisp->release();
    if (failed(hr))
      return hr;

    ienumunknown* penumerator;
    // 獲得枚舉器
    hr = pcontainer->enumobjects(olecontf_embeddings, &penumerator);
    pcontainer->release();
    if (failed(hr))
      return hr;

    iunknown* punk;
    ulong ufetched;
    // 枚舉并刷新所有frame
    for (uint i = 0; s_ok == penumerator->next(1, &punk, &ufetched); i++)
    {
      iwebbrowser2* pbrowser;

      hr = punk->queryinterface(iid_iwebbrowser2, (void**)&pbrowser);
      punk->release();
      if (succeeded(hr))
      {
         pbrowser->refresh();
         pbrowser->release();
      }
    }
    penumerator->release();
}

  3、訪問的多層嵌套frame

  注意每個frame又可以包含自己的frame,而上面所說的方法則是針對一個webbrowser的窗口實現(xiàn)的,并不會涉及到深層的frame。要實現(xiàn)多層嵌套frame的訪問,只需要加入一點遞歸的操作就行了。如對1中的prightframewindow和2中的pbrowser,將函數(shù)稍加修改,在得到兩個指針后作遞歸調(diào)用即可。

  4、訪問源代碼

  下面的方法來自chtmlview,是比較正規(guī)的方法(能夠保持網(wǎng)頁的原始格式)。

bool chtmlview::getsource(cstring& refstring)
{
  bool bretval = false;
  ccomptr<idispatch> spdisp = gethtmldocument();

  if (spdisp != null)
  {
    hglobal hmemory;
    hmemory = globalalloc(gmem_moveable, 0);
    if (hmemory != null)
    {
      ccomqiptr<ipersiststreaminit> sppersiststream = spdisp;
      if (sppersiststream != null)
      {
        ccomptr<istream> spstream;
        if (succeeded(createstreamonhglobal(hmemory, true, &spstream)))
        {
          sppersiststream->save(spstream, false);

          lpctstr pstr = (lpctstr) globallock(hmemory);
          if (pstr != null)
          {
            // stream is always ansi, but cstring
            // assignment operator will convert implicitly.

            bretval = true;
            try
            {
              refstring = pstr;
            }
            catch_all(e)
            {
              bretval = false;
              delete_exception(e);
            }
            end_catch_all

            if(bretval == false)
              globalfree(hmemory);
            else
              globalunlock(hmemory);
          }
        }
      }
    }
  }
 
  return bretval;
}

菜鳥學(xué)堂:
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 磴口县| 清流县| 南汇区| 双牌县| 蓝田县| 绵竹市| 鲁山县| 汕头市| 二连浩特市| 辰溪县| 吉安市| 永新县| 陈巴尔虎旗| 顺义区| 玛纳斯县| 磴口县| 华阴市| 香格里拉县| 棋牌| 眉山市| 上虞市| 剑川县| 扶余县| 城口县| 裕民县| 天镇县| 蒙阴县| 合水县| 内丘县| 大港区| 鄂托克旗| 巫山县| 微山县| 建湖县| 望都县| 民权县| 连城县| 涿鹿县| 温州市| 建瓯市| 格尔木市|