获取IE (控件)的所有链接(包括Frameset, iframe)zz

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南 本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。 阅读详情
获取IE (控件)的所有链接(包括Frameset, iframe)zz

IE 顶层 body 节点通过IHTMLElement->get_all 方法无法获取iframe 里面的节点列表

CComPtr<IHTMLElement> body;
 
CComPtr<IDispatch> spDispCollection;
body->get_all(&spDispCollection);
所以要获取iframe/frame(frameset) 里面的节点列表的话, 则需要根据body/doc 找到frames, 然后从frames -> IHTMLWindow2 -> IHTMLDocument2 . 主要有2个方法, 下面是代码片段
方法一:
IHTMLDocument2 *pDoc = 浏览器的Document(IWebBrowser2->IDispatch->IHTMLDocument2);
IHTMLWindow2 *pHTMLWnd = NULL;
IHTMLDocument2 *pFrameDoc=NULL;
IHTMLFramesCollection2 *pFramesCollection=NULL;
LPDISPATCH lpDispatch;

long p;
VARIANT varindex,varresult;
varresult.vt=VT_DISPATCH;
varindex.vt = VT_I4;
if(pDoc!=NULL)
{
     HRESULT hr=pDoc->get_frames(&pFramesCollection);
    if(SUCCEEDED(hr)&&pFramesCollection!=NULL)
     {
         hr=pFramesCollection->get_length(&p);
        if(SUCCEEDED(hr))
            for(int i=0; i<p; i++)
             {
                 varindex.lVal = i;
                if(pFramesCollection->item(&varindex, &varresult) ==S_OK)
                 {
                     lpDispatch=(LPDISPATCH)varresult.ppdispVal;
                    if (SUCCEEDED(lpDispatch->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pHTMLWnd)))
                     {
                        if(SUCCEEDED(pHTMLWnd->get_document( &pFrameDoc)))
                         {
                            //work with the pFrameDoc
                         }
                         pHTMLWnd->Release();
                         pHTMLWnd=NULL;
                     }
                 }
             }
             pFramesCollection->Release();
     }
     pDoc->Release();
}
方法二:
CComQIPtr<IHTMLElement> pElem = ; // 可以递归上面的 CComPtr<IDispatch> spDispCollection 来得到
CComBSTR bstrTagName;
pElem->get_tagName(&bstrTagName);
if ( lstrcmpiW(L"IFRAME", bstrTagName)==0 ||
         lstrcmpiW(L"FRAME", bstrTagName)==0 )
{
     CComQIPtr<IHTMLFrameBase2>     _framebase2;
     CComPtr<IHTMLWindow2>         _framewindow;
     CComPtr<IHTMLDocument2>         _framedoc;
   
    if( (_framebase2 = spItem)
        && SUCCEEDED( _framebase2->get_contentWindow(&_framewindow) ) && _framewindow!=NULL
        && SUCCEEDED( _framewindow->get_document(&_framedoc) ) && _framedoc!=NULL )
     {
        // 对 _framedoc 节点进行处理
     }
}

iframe 跨域访问(cross frame)   zz from : http://www.wzszf.com/
由于安全性限制, 为防止跨域脚本攻击, 当frames 跨域的时候, IHTMLWindow2::get_document 调用将返回 E_ACCESSDENIED .
下面函数 HtmlWindowToHtmlDocument 对于跨域的frame 通过 IHTMLWindow2 -> IID_IWebBrowserApp -> IHTMLWindow2 绕过了限制.

// Converts a IHTMLWindow2 object to a IHTMLDocument2. Returns NULL in case of failure.
// It takes into account accessing the DOM across frames loaded from different domains.
CComQIPtr<IHTMLDocument2> HtmlWindowToHtmlDocument(CComQIPtr<IHTMLWindow2> spWindow)
{
      ATLASSERT(spWindow != NULL);

      CComQIPtr<IHTMLDocument2> spDocument;
      HRESULT hRes = spWindow->get_document(&spDocument);
   
     if ((S_OK == hRes) && (spDocument != NULL))
      {
          // The html document was properly retrieved.
          return spDocument;
      }

     // hRes could be E_ACCESSDENIED that means a security restriction that
     // prevents scripting across frames that loads documents from different internet domains.
      CComQIPtr<IWebBrowser2>   spBrws = HtmlWindowToHtmlWebBrowser(spWindow);
     if (spBrws == NULL)
      {
          return CComQIPtr<IHTMLDocument2>();
      }

     // Get the document object from the IWebBrowser2 object.
      CComQIPtr<IDispatch> spDisp;
      hRes = spBrws->get_Document(&spDisp);
      spDocument = spDisp;

     return spDocument;
}


// Converts a IHTMLWindow2 object to a IWebBrowser2. Returns NULL in case of failure.
CComQIPtr<IWebBrowser2> HtmlWindowToHtmlWebBrowser(CComQIPtr<IHTMLWindow2> spWindow)
{
      ATLASSERT(spWindow != NULL);

      CComQIPtr<IServiceProvider>   spServiceProvider = spWindow;
     if (spServiceProvider == NULL)
      {
          return CComQIPtr<IWebBrowser2>();
      }

      CComQIPtr<IWebBrowser2> spWebBrws;
      HRESULT hRes = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&spWebBrws);
     if (hRes != S_OK)
      {
          return CComQIPtr<IWebBrowser2>();
      }

     return spWebBrws;
}

附:
IE(控件/接口)中主要有4个部分, Browser, Document, Frame/IFrame, Element , 其对应接口分别是
Browser          -     IWebBrowser2
Document       -     IHTMLDocument2
Frame/IFrame-     IHTMLWindow2
Element          -     IHTMLElement
可以通过下面方法互相获取
browser      -> document        IWebBrowser2::get_Document
document     -> frame           IHTMLDocument2::get_parentWindow
frame        -> document        IHTMLWindow2::get_document
frame        -> parent frame    IHTMLWindow2::get_parent
frame        -> children frames IHTMLWindow2::get_frames
element     -> Frame              IHTMLElement->QI(IHTMLFrameBase2) -> IHTMLFrameBase2->get_contentWindow -> IHTMLWindow2

动力学约束下的运动规划算法——状态栅格规划器(State Lattice Planner) A*、RRT等算法建立的用于路径搜索的图模型是不考虑机器人的动力学约束的,其构建的图模型的两个相邻节点之间的路径可能是不可行的,或者很难被机器人跟踪的,现在我们想要使得图中相邻两个节点间的连接是一种满足动力学约束的可行的连接,那么如何构建一个这样的图呢? 构建这样的图通常有两种方法:第一种是基于控制空间的采样(正向方法) 阅读详情

相关推荐

中移物联ML307C模组OPENCPU开发环境搭建全攻略

本文详细介绍了中移物联ML307C模组OPENCPU开发环境搭建的全过程。从OPENCPU模式的核心优势解析,到SDK获取、Python与scons工具安装,再到解读SDK目录结构与实战编译命令,最后提供常见问题避坑指南,帮助开发者快速构建高效的物联网应用编译环境。

weixin_29168393的博客 746

获取IE (控件)的所有链接(包括Frameset, iframe)

  获取IE (控件)的所有链接(包括Frameset, iframe) IE 顶层 body 节点通过IHTMLElement->get_all 方法无法获取iframe 里面的节点列表 CComPtrIHTMLElement> body; CComPtrIDispatch> spDispCollection;body->get_all(&spDispColl

skyremember的专栏 2396

WGCNA分析中那些没人告诉你的坑:以肺结核差异基因模块筛选为例

本文深入探讨WGCNA分析在肺结核差异基因模块筛选中的七个关键陷阱,包括soft-thresholding选取、样本离群值检测、模块合并阈值调整等。通过实际案例和R代码示例,揭示生信数据挖掘中常被忽视的技术细节,帮助研究者避免常见错误,提升分析结果的可靠性和生物学意义。

weixin_29218509的博客 261

Krabber——基于Internet Explorer内核的网页信息抓取程序

 程序开发背景   本程序来源于我们项目组最近正在开发的一个开源项目——网页分块工具。其目的是作为一个底层的信息抽取模块,为后期分析提供尽可能详尽的分块线索,包括尽可能完整的HTML源代码和网页元素的位置、颜色、字体、背景色等信息。程序还 要具有较好的适应性,能够支持多种网页,而事实上很多网页都是不标准的。从通用性考虑,程序应该能够支持多种应用,而不仅限于网页分块。   预期目标分

pinlin168的专栏 2554

瑞萨 RL78 开发环境实战:从 CS+ for CC 到 e² studio 高效开发

本文详细介绍了瑞萨RL78单片机开发环境的选择与配置,对比分析了CS+ for CC和e² studio的特点及适用场景。内容涵盖环境安装、工程创建、调试技巧、外设驱动开发和低功耗设计等实战经验,为开发者提供全面的RL78入门指南,帮助快速上手并高效开发。

4k5l6j7h8的博客 245

V90伺服 EPOS模式下回原(详细配置+SCL源代码)

/ 输出上限 100.0%rSetPoint : Real;// 设置目标值工程量。// 通道转换参考值。Td : Real;

RXXW_Dor的博客 2666

C# 中控件 WebBrowser 对 frameset/ iframe 操作和内容获取

1.获取frame的document HtmlDocument htmlDoc = webBrowser1.Document; htmlDoc = webBrowser1.Document.Window.Frames["frmRpt"].Document; // "frmRpt"为iframe的name; 2.获取frame的源文件 MessageBox.Sho...

weixin_30832405的博客 261

UG\NX二次开发 获取三平面交点

//如果返回值不为0 则此三个面没交点 int three_faces_point(tag_t tagFace1, tag_t tagFace2, tag_t tagFace3, double *dou_x, double *dou_y, double *dou_z)

王牌飞行员_里海的博客 675

利用webBrowser获取框架内Html页面内容

利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说。 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 HTML 文档的窗口。使用框架可以轻松地创建 HTML 页面,其中一页或多页在其他框架持续更改它们内容的同时保持静态,例如导航栏。 HTML 作者可以采用以下两种方法之一创建框架: 使用 FRAMESET 和 FRAME 标记,创建固定窗口

小猪的专栏 2128

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

宁波阿成的博客 903

【大语言模型 21】语言模型训练目标:MLM vs CLM vs GLM对比分析

本文深入对比分析三种主流语言模型训练目标:掩码语言模型(MLM)、因果语言模型(CLM)和双空白填充(GLM)。通过数学推导、代码实现和实验对比,揭示不同训练目标的工作机制、适用场景和性能差异,为选择合适的预训练策略提供科学指导。

熵数实验室 1177

用 Microsoft.mshtml.dll 和 WebClient 自己实现网页保存为 MHT 文件

相信大家经常用IE保存网页功能保存有价值的网页,但是IE的网页保存功能做的不是太好,经常会有些页面保存失败。我也深受其烦,好在本人是程序员,程序员最大的好处是会自己编软件。正好我自己开发了个多页签浏览的IE,于是便在其中增加了网页保存为MHT文件的功能。网页保存为MHT功能主要包含以下几个关键问题:1)修改所有相对链接为绝对链接;2)把网页内容连同包含的 JS、图片、CSS等文件下载到

框架提高生产力 4936

从 RAP OData 到可交付的 SAP Fiori 应用:部署与授权全链路实战笔记

摘要:本文探讨了RAP开发中常见的交付误区,指出开发者预览(FEAP)并非可部署应用,强调从服务发布到业务应用落地的完整链路。文章详细对比了不同部署路径(ABAP/BTP),解析权限管理关键点(SAP_BR_DEVELOPER的临时性),并提供了标准授权组合方案(IAM+业务目录+角色)。通过"发运跟踪"案例,展示了从开发验证到生产部署的全流程,特别提醒注意开发环境与生产环境的权限差异,避免"开发机正常、生产机403"的典型问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1402

Javaweb基础--HTML

HTML基础标签 <!-- html解释型语言 html页面 有有一组标签组 :<html></html> <html>:开始标签 </html>:结束标签 <title></title>:网页标题 <br>:换行,单标签 <p> </p>:段落标签 h1~h6 :标题标签 <b></b>

weixin_44721043的博客 307

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

html语言简单,HTML语言范例

三、HTML利用超链接打开链接文件3. 1、建立超链接点击 当中的内容,即可打开一个链接文件,href 属性则表示这个链接文件的路径。 使用 target属性,可以在一个新窗口里打开链接文件。 HTML语言如下: 这是百度的链接 从新的页面打开网易的主页 效果如下:3. 2 、将一个图片作为一个超链接演示了如何将一个图片作为一个超链接,即点击一个图片,可以连接到其它文件。 HTM...

weixin_29912855的博客 286

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HTML最全标签

一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(DTD)。 标签:a 说明:标明超链接的起始或目的位置。 标签:acronym 说明:标明缩写词。 标签:address 说明:特定信息,如地址、签名、作者、此文档的原创者。 标签:applet 说明:在页面上放置可执行内容。 标签:area 说明:定义一...

weixin_30341745的博客 171

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2024年Java最全Javaweb笔记---frameset的使用_frame对象怎么用在javaweb中,阿里+头条+腾讯大厂Java笔试真题

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。第一个是算法关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本。

2401_84024148的博客 1008

ASP.NET程序开发范例宝典

<div id="cnblogs_post_body"><p>在整理资料时发现一些非常有用的资料源码尤其是初学者,大部分是平时用到的知识点,可以参考其实现方法,分享给大家学习,但请不要用于商业用途。</p> <p>如果对你有用请多多推荐给其他人分享。</p> <p>点击对应章节标题下载本章节下所...

weixin_30878361的博客 1217

html元素

a表示超链接的起始或目的位置。acronym表 示取首字母的缩写词。address表 示特定信息,如地址、签名、作者、文档信息。applet在 页面上放置可执行内容。area定 义一个客户端图像映射中一个超级链接区域的形状、坐标和关联 URL。b指 定文本应以粗体显示。base指 定一个显式 URL 用于解析对于外部源的链接和引用,如图像和样式表。basefont设 置显示文本时作为默认字体的基础

linuxchyu的专栏 847
上一篇: (BCB) CComPtr<IHTMLDocument2> FIEDoc;
下一篇: 飞鸽传书从微软官网上了解到微软正在推动虚拟化
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值