两种方法访问多层嵌套的frame

原创 2015年11月19日 19:49:57

问========================================

在您的网站拜读了关于TWebBrowser的使用方法,但是一直有一个问题困扰我,就是如何取得frame嵌套frame的HTML的原码,我只是知道单个frame如何取得源码,但是多个frame嵌套就没有办法,请教一下!

2004-09-29 23:41:28


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

要得到源代码,必须先得到frame。访问frame一般说来有两种方法:

1、通过WebBrowser的文档接口得到frame的集合,再逐一访问。

HRESULT IHTMLDocument2::get_frames(IHTMLFramesCollection2 **p);

由IHTMLFramesCollection2接口的item方法,可以以frame的索引号(从0开始)或frame的名称来访问相应的frame,pvarResult则返回一个IDispatch接口(或一个IDispatch接口的数组,多层嵌套的情况).

HRESULT item(          
    VARIANT *pvarIndex,
    VARIANT *pvarResult
);

例子如下,假设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的窗口实现的,并不会涉及到深层的frame。要实现多层嵌套frame的访问,只需要加入一点递归的操作就行了。如对1中的pRightFrameWindow和2中的pBrowser,将函数稍加修改,在得到两个指针后作递归调用即可。


4、访问源代码
下面的方法来自CHtmlView,是比较正规的方法(能够保持网页的原始格式)。


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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

frame窗口嵌套问题解决

在frameset中如果嵌套了几个frame,每一个frame中是一个html,可能会出现显示网页的zhon...
  • xxzblog
  • xxzblog
  • 2014年10月28日 17:58
  • 985

第14节 html中嵌套框架iframe

frame和iframe的区别:1.framset标签与body标签属于同级标签,frame不许嵌套在frameset中才能显示。 2.frame的宽高有framset约束。 3.iframe可以...
  • qq_32895969
  • qq_32895969
  • 2017年02月13日 15:53
  • 794

frame和iframe的使用与总结

js 操作frameset frame 对象 框架编程概述 一个HTML页面可以有一个或多个子框架,这些子框架以来标记,用来显示一个独立的HTML页面。这里所讲的框架编程包括框架的自我控制以及框架...
  • klicky
  • klicky
  • 2014年10月15日 10:29
  • 9352

python selenium 定位iframe(多层框架)

python selenium 定位iframe(多层框架)
  • xm_csdn
  • xm_csdn
  • 2016年12月01日 10:43
  • 3998

android2.3平台上web页面(html5中使用frame)不能滑动的解决方法

问题描述 web页面采用html5技术实现,在系统登录页面中使用frameset、frame来嵌套另一个页面,结果当android2.3移动设备访问该页面时触摸屏不能上下滑动页面。 解决方法 1...
  • wuruixn
  • wuruixn
  • 2013年02月19日 17:59
  • 7388

frame和iframe的使用与总结

js 操作frameset frame 对象 框架编程概述 一个HTML页面可以有一个或多个子框架,这些子框架以来标记,用来显示一个独立的HTML页面。这里所讲的框架编程包括框架的自我控制以及框架...
  • klicky
  • klicky
  • 2014年10月15日 10:29
  • 9352

Frame 用于Preloader的两种方法

Frame metadata tag的本质是编译选项。 通过编译选项 AS3工程 Custom Preloader 動態加載 Application Adobe Flex 工程的 Appli...
  • lqk1985
  • lqk1985
  • 2011年09月13日 16:26
  • 2241

Frame动画的两种方法(写死的Xml与SD卡图片动态加载)

注意: 有时动画会出现停留在第一帧不播放的情况。 是因为window还没有加载好。 所以最好这样: @Override public void onWindowFocusChanged(boolean...
  • Value_Liu
  • Value_Liu
  • 2013年05月22日 00:11
  • 2016

android两种动画 Tween Animation和Frame Animation使用方法总结 (转载 写的很好)

Android SDK介绍了2种Animation: Tween Animation(渐变动画):通过对特定的对象做图像变换如平移、缩放、旋转、淡出/淡入等产生动画效果 Frame Ani...
  • caijunjun1006
  • caijunjun1006
  • 2013年08月23日 11:58
  • 962

多层Fragment嵌套出现重影问题_原理解析_解决方法(Winter原创,转载请注明出处)

多层Fragment嵌套出现重影问题_原理解析_解决方法(Winter原创,转载请注明出处) 1解决bug的思想: //step1:当bug被发现(排除极低偶然性,单次性,开发工具导致) ...
  • micotale
  • micotale
  • 2016年05月24日 17:15
  • 1006
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两种方法访问多层嵌套的frame
举报原因:
原因补充:

(最多只允许输入30个字)