IE里的探索

程序化广告行业(23/89):深度剖析广告效果评估指标 大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要 阅读详情
                                              IE里的探索
        青苹果工作室 2001年02月08日 13:28

  本节解释Microsoft Internet Explorer 4.0及更高版本的体系结构并提供使用它的组件时用到的信息,包括以下内容:* 体系结构概览;* 选择正确的组件;* 提供附加控制;* 控制上下文相关菜单;* 扩展动态 HTML 对象模型;* 控制下载;* 安全管理。

体系结构概览
  Internet Explorer 使用 Microsoft ActiveX 控件和 Active Document 接口来连接各个组件。下图提供了一个高层的概览:


  IExplore.exe 在最上层;它是一个在 Internet Explorer 加载时被实例化的一个小应用程序。这个可执行的应用程序使用 Internet Explorer 来完成浏览、历史维护、收藏夹维护、HTML 语法分析和翻译等,同时它为独立的浏览器提供工具栏和框架。IExplorer.exe 直接引用 Shdocvw.dll 组件。

  然后 Shdocvw.dll 引用 Mshtml.dll 组件,当用户浏览到特定的类型的文档时,他还可以引用其它可以加载到浏览其中的 Active Document 组件 (如 Microsoft Office 应用程序)。Shdocvw.dll 提供与浏览、内置连接、收藏家和历史管理以及图形支持相关的功能。这个DLL 也向它的宿主提供接口以便可以像一个 ActiveX 控件一样被单独引用。Shdocvw.dll 组件更经常作为 WebBrowser 控件被引用。内置连接是指点击已加载文档中的 HTML 链接,然后在 WebBrowser 控件的同一实例中加载一个新的 HTML 文档的能力。如果只引用了 Mshtml.dll,点击链接导致新的浏览器实例产生。

  Mshtml.dll 是在 Internet Explorer 4.0 或更高版本中进行 HTML 语法分析和翻译的组件,同时通过动态 HTML对象模型提供 HTML 文档。这个组件引用脚本引擎、Microsoft 虚拟机、ActiveX 控件、插件以及它加载的 HTML 文档可能引用的其它对象。Mshtml.dll 实现 Active Document 服务器接口,这样,就能通过标准 COM 接口引用它。

  使用框架时,Shdocvw.dll 又被 Mshtml.dll 引用,这样就形成了第归。这种情况下,每一个帧都是一个引用 Mshtml.dll 的 Shdocvw.dll 的实例。

  由于这是一个基于 OLE 的体系结构,ActiveX 控件常用的周边属性也同样适用于 Internet Explorer 组件。通过这种方式,WebBrowser 控件的宿主可以设置周边属性以过滤加载的文档引用的所有帧和控件。

选择正确的组件控件
  WebBrowser 控件提供丰富的宿主需要的典型功能,如内置连接等。这样,对大多数浏览或查看 HTML 文档的应用程序而言,引用 WebBrower 比引用 MSHTML 更合适。只有特殊的,例如,对 HTML 进行语法分析的应用程序我们建议引用 MSHTML。

  还需要注意的是,虽然引用 MSHTML 稍微比引用 WebBrowser 控件轻巧一点,但节约的开销很少能补偿那些实现在 WebBrowser 中已有功能时所需的额外工作。WebBrowser很可能已经被加载到内存,并且浏览包含框架的页面也会导致 WebBrowser 作为标准工作集的一部分从而被加载。

提供附加控制
  WebBrowser 和 MSHTML 组件的宿主可以控制特定的功能。对 WebBrowser 控件而言,这包括浏览并且在加载文档时接受事件。这两个组件都能通过实现 IDocHostUIHandler 和 IDocHostShowUI 接口提供附加控制。这些接口通常用于替代浏览期默认提供的上下文相关菜单。它们的用途还包括设置三维边框、替代保存选项的注册表项的位置和扩展动态 HTML 对象模型。

  组件通过在宿主应用程序实现的 IOleClientSite 上调用 QueryInterface 从宿主获得这些接口。

控制上下文相关菜单
  引用 WebBrowser 控件时有一个常见的要求,就是能够替代或添加在浏览器窗口中点击右键时显示的上下文相关菜单。那些使用 WebBrowser 控键查看丰富内容而不希望用户知道他们在查看 HTML 的应用程序特别需要这种能力。同时,这种能力对不希望用户能看到内容的 HTML 源代码的应用程序很有用处。

  有两种技术可以完成这一工作。第一种涉及到使用 IDocHostUIHandler 接口并允许应用程序禁止或替代上下文相关菜单。第二种技术使用注册表并允许扩展已有的上下文相关菜单。

  ●替代上下文相关菜单

  通过实现 IDocHostUIHandler::ShowContextMenu 方法能将 WebBrowser 控件的 上下文相关菜单整体替换。从此方法中返回 E_NOTIMPL 或 S_FALSE 告诉 WebBrowser 它应该显示它自己的标准上下文相关菜单。然而,返回 S_OK 致使 WebBrowser 不显示 它的菜单,并假定宿主程序采取了适当的行动。宿主程序可以禁止所有上下文相关菜单 或使用它自己的上下文相关菜单。向实现这一方法的宿主程序提供的参数使宿主程序 能够识别 WebBrowser 将显示的默认菜单和菜单的坐标。这样就向宿主程序提供了全部 上下文相关菜单。例如,宿主程序可以选择仅仅替代图形的上下文相关菜单而保留标准 的上下文相关菜单。

  ●添加标准上下文相关菜单

  通过在注册表里添加项目并将它们连接到执行脚本的 URL,可以向WebBrowser已有的上下文相关菜单中添加菜单项。要向标准上下文相关菜单中添加菜单项,创建或打开:

  HKEY_CURRENT_USER

      Software

        Microsoft

          Internet Explorer

            MenuExt

  在此位置,以你所希望在菜单中显示的文本为键名创建新键。键的默认值为将要执行的URL。键名可以包括&字符,表示紧跟在 & 之后的字符将带有下划线。URL 将被加载到一个隐藏的 HTML 对话框,所有嵌入脚本将被执行,然后关闭对话框。隐藏的 HTML 对话框的 external.menuArguments 属性包含了执行上下文相关菜单项的窗口的 window 对象。

  以下注册表内容向 WebBrowser 的上下文相关菜单中添加标题为“My Menu Item”的菜单项,它执行包含文件 c:/myscript.htm 中的嵌入脚本。

  HKEY_CURRENT_USER

      Software

        Microsoft

          Internet Explorer

            MenuExt

              My Menu Item = "file://c:/myscript.htm"

  c:/myscript.htm 的内容如下:

  <SCRIPT LANGUAGE="JavaScript" defer>

    var parentwin = external.menuArguments;

    var doc = parentwin.document;

    var sel = doc.selection;

    var rng = sel.createRange();

    var str = new String(rng.text);

    if(str.length == 0)

      rng.text = "MY INSERTED TEXT";

    else

      rng.text = str.toUpperCase();

  </SCRIPT>

  这个脚本通过 external.menuArguments 获得上级窗口对象。上级窗口对象时执行上下文相关菜单的 WebBrowser。然后,脚本获得当前选中区域,随后,如果当前选中区域不存在,就在执行上下文相关文档的位置插入文本“MY INSERTED TEXT”。如果当前选中区域存在,将选中的文本变成大写。

  ●可选注册表项

  在我们刚才创建的注册表项下有一对可选值。其中之一指明此菜单项将出现在哪一个上下文相关菜单中。另一个指明将以对话框方式运行脚本。

  DWORD 键值 “Contexts” 指明在哪一个上下文相关菜单中将出现此菜单项。它是由下列数值 (定义在 Mshtmhst.h 中) 以逻辑“或”方式组合起来的位掩码。这些数值同在 IDocHostUIHandler::ShowContextMenu 调用中传递的常数一致。

  (0x1 << CONTEXT_MENU_DEFAULT) (evaluates to 0x1)

  (0x1 << CONTEXT_MENU_IMAGE) (evaluates to 0x2)

  (0x1 << CONTEXT_MENU_CONTROL) (evaluates to 0x4)

  (0x1 << CONTEXT_MENU_TABLE) (evaluates to 0x8)

  (0x1 << CONTEXT_MENU_TEXTSELECT) (evaluates to 0x10)

  (0x1 << CONTEXT_MENU_ANCHOR) (evaluates to 0x20)

  (0x1 << CONTEXT_MENU_UNKNOWN) (evaluates to 0x40)

  所以,例如,如果你希望这个简单的扩展只出现在默认菜单和文本选择菜单中,你在注册表象 My Menu Item 下创建一个叫“Contexts”的 DWORD 键值,并将它设置为 0x11。在 C/C++ 代码中,可以使用以下表达式:

  (0x1 << CONTEXT_MENU_DEFAULT) | (0x1 << CONTEXT_MENU_TEXTSELECT)

  另一个可选的注册表 DWORD 键值是“Flags”。它只有一个有效位 (0x1);在Mshtmhst.h 中被定义为 MENUEXT_SHOWDIALOG。当此位被设置时,将像通过 showModalDialog 调用脚本时那样执行它。运行脚本的窗口不隐藏,并且执行完嵌入和 onload 脚本后不自动关闭对话框。external.menuArguments 的值仍然包含用户选择菜单项的 window 对象。

  ●上下文相关菜单事件

  当上下文相关菜单扩展被触发时,主窗口的事件对象 (external.menuArguments.event)包含有关于用户点击何处和显示哪一个上下文相关菜单的信息。鼠标的坐标和event.srcElement 同时有效。event.type 的值包含以下字符串,指明显示了哪一个上下文相关菜单:

  MenuExtDefault

  MenuExtImage

  MenuExtControl

  MenuExtTable

  MenuExtTextSelect

  MenuExtAnchor

  MenuExtUnknown

  ●另一个例子

  本例在默认上下文相关菜单中创建一个新菜单项。新菜单项叫 Show In New Window,用来启动一个显示当前文档的指定部分的新窗口。如果有些东西嵌入在层次很深的框架中,你可以方便地在它自己的窗口中启动它。

  以下是一个运行后插入正确的注册表设置的 .reg 文件的内容。此文件名为Example2.reg。在 Windows Explorer 中双击此文件将设置插入注册表。

  REGEDIT4

    [HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/Show in New Window]

    @="file://c://example2.htm"

    "Contexts"=dword:00000001

  Here are the contents of c:/example2.htm:

  <SCRIPT LANGUAGE="JavaScript" defer>

      open(external.menuArguments.location.href);

  </SCRIPT>

扩展动态 HTML 对象模型
  宿主应用程序可以扩展动态 HTML 对象模型以便脚本可以引用宿主提供的功能。这些脚本通过指定窗口对象可用的外部对象来引用宿主程序。例如,引用“window.external.speech”调用宿主程序以解析名称“speech”。文档里的所有标准脚本将像往常一样地执行。

  这种扩展机制就是在宿主程序中为对象模型扩展提供一个 IDispatch 接口,引用外部对象时将在它上面调用 GetIDsofNames 和 Invoke。WebBrowser 或 MSHTML 组件通过调用宿主的 IDocHostUIHandler::GetExternal 方法获得所提供的 IDispatch。

  关于扩展动态 HTML 对象模型的例子,参见例程序 Driller。

控制下载
  宿主可以在某些方面控制下载—帧、图形、Java等等—通过实现 IOleClientSite 和一个定义为 DISPID_AMBIENT_DLCONTROL 的周边属性。当 dispidMember 设置为DISPID_AMBIENT_DLCONTROL 调用宿主的 IDispatch::Invoke 方法时,它应该将pvarResult 设置为 0 或下列值的组合:

  DLCTL_BGSOUNDS 浏览器组件播放同文档相联的背景声音;

  DLCTL_DLIMAGES 浏览器组件从服务器下载图形;

  DLCTL_DOWNLOADONLY 浏览器组件下载页面但不显示;

  DLCTL_FORCEOFFLINE 浏览器组件工作在脱机方式。通过 URLMON 提出请求时, 即使计算机连接了互联网,也设置 BINDF_OFFLINEOPERATION 标志;

  DLCTL_NO_BEHAVIORS 浏览器组件不执行任何行为;

  DLCTL_NO_CLIENTPULL 浏览器组件不执行任何客户端的 pull 操作;

  DLCTL_NO_DLACTIVEXCTLS 浏览器组件不下载文档中的任何 ActiveX 控件;

  DLCTL_NO_FRAMEDOWNLOAD 浏览器组件对包含框架的页面进行语法分析但不下载任何帧, 同时忽略框架,不翻译任何 frame 标记;

  DLCTL_NO_JAVA 浏览器组件不执行任何 Java applet;

  DLCTL_NO_METACHARSET 浏览器组件隐藏文档中的 META 元素指示的字符集;

  DLCTL_NO_RUNACTIVEXCTLS 浏览器组件不执行文档中的任何 ActiveX 控件;

  DLCTL_NO_SCRIPTS 浏览器组件不执行任何脚本;

  DLCTL_OFFLINE 与 DLCTL_OFFLINEIFNOTCONNECTED 相同;

  DLCTL_OFFLINEIFNOTCONNECTED 如果未连接互联网,浏览器组件将以脱机方式工作。通过 URLMON 提出请求时,即使计算机连接了互联网,也设置 BINDF_GETFROMCACHE_IF_NET_FAIL 标志;

  DLCTL_PRAGMA_NO_CACHE 浏览器组件迫使请求发送给服务器并忽略代理,即使代理指明 数据是最新的也是如此。通过 URLMON 提出请求时,设置 BINDF_PRAGMA_NO_CACHE 标志;

  DLCTL_RESYNCHRONIZE 浏览器组件忽略缓存中的数据并向服务器请求更新。如果服务器指明 缓存中的数据是更新了的则使用缓存数据。通过 URLMON 提出 请求时,设置 BINDF_RESYNCHRONIZE 标志;

  DLCTL_SILENT 浏览器组件不显示用户界面。通过 URLMON 提出请求时,设置 BINDF_SILENTOPERATION 标志;

  DLCTL_URL_ENCODING_DISABLE_UTF8 浏览器组件禁止 UTF-8 编码;

  DLCTL_URL_ENCODING_ENABLE_UTF8 浏览器组件允许 UTF-8 编码;

  DLCTL_VIDEOS 浏览器组件播放文档中包含的视频片断。

安全管理
浏览器组件的宿主可以实现它们自己的安全管理并替代 WebBrowser 中已有的设置。通过实现 IInternetSecurityManager 接口完成这一功能。浏览器组件以SID_SInternetSecurityManager 参数调用宿主的 IServiceProvider::QueryService方法来获得这个接口
IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍 IAR 一般是指一款嵌入式软件的集成开发环境,类似于 MDK-Keil 这款软件。IAR 对于不同的内核处理器,是对应不同的 IAR 软件的,IAR 到目前为止支持大部分的MCU,比如8051系列、ARM架构系列、MSP430系列、AVR系列等等这些常用的芯片架构。对于 ARM 架构的芯片,有对应的 IAR Embedded Workbench for ARM 软件平台,因为我主要是使用 ARM 架构芯片,下面安装、注册和使用都是基于这个版本进行介绍的。 阅读详情

相关推荐

汇率波动率建模实战:从GARCH到EGARCH的金融时间序列分析

在金融时间序列分析中,波动率建模是量化市场风险的核心技术。其基本原理在于捕捉金融资产收益率序列中存在的波动聚集、尖峰厚尾等典型特征。通过建立条件异方差模型,如GARCH及其扩展模型,可以动态估计和预测未来波动率,这对于资产定价、风险管理和投资决策具有重要价值。在金融工程领域,该技术广泛应用于外汇、股票和衍生品市场。本文以汇率波动率建模为具体场景,详细阐述了如何使用Python中的arch库,从数据预处理、模型选型(包括GARCH、EGARCH等)、参数估计到样本外预测评估的全流程实践,并深入探讨了模型在应对

weixin_32629853的博客 341

external.menuArguments 右键应用

<script type="text/javascript" defer>var oWindow = window.external.menuArguments; var oDocument = oWindow.document; var oSelect = oDocument.selection; var oSelectRange = oSelect.createRange(); v...

weixin_30808693的博客 280

GEE 案例:利用多源遥感数据计算RUSLE(Revised Universal Soil Loss Equation)土壤侵蚀

该数据集提供了全球范围内以250至500米的空间分辨率获取的多光谱图像数据,用于监测地表覆盖和变化。RUSLE模型的基本原理是通过考虑土壤侵蚀的主要驱动因素,来估计土壤侵蚀的速率。该数据集提供了全球范围内以10至60米的空间分辨率获取的多光谱图像数据,用于监测地表覆盖和变化。它对农业和土地资源管理者提供了一种评估和预测土壤侵蚀风险的工具,以制定适当的土壤保护措施和决策。2. soil(土壤)是来自OpenLandMap的土壤纹理分类数据,使用了USDA(美国农业部)土壤纹理分类系统。

此星光明博客 760

通过修改注册表添加IE右键菜单

最近在开发一个项目的时候,希望在IE的右键菜单中添加快捷操作。因为暂时还来不及开发插件,通过安装程序添加IE右键菜单,因此想到的最简单的方法就是修改注册表。IE的右键菜单扩展位于注册表[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt] 项下。在此建立一个新项,项的名称就是出现在右键菜单中的标题,因此我建立了一个新项“

Brookes的专栏 1万+

external.menuArguments的相关资料

external: is an object which allows access to an additional object model provided by IE. menuArguments: is a property which returns ...

JavaNoob的博客 352

通过IE提供的window.external来再javascript中调用winform中的函数

开始加入这个说明,System.Runtime.InteropServices.ComVisibleAttribute(true)]然后设置webBrowser1.ObjectForScripting = this;然后能在脚本中访问winform中定义的元素了。    

SoNg的专栏 1209

html中插入external link,使用external.menuarguments在Internet Explorer窗口中修改HTML

我有一个vb.net类,它是用internet explorer中的上下文菜单扩展调用的。代码可以访问页面的对象模型,读取数据不成问题。这是测试函数的代码…它更改状态栏文本(ok),打印页面html(ok),通过添加文本更改html,然后再次打印页面html(ok,在第二个弹出窗口中,我添加的文本在html中)但Internet Explorer窗口不显示它。我做错什么了?Public Sub C...

weixin_31861647的博客 249

IE探索之添加浏览器

本文解释如何在 Microsoft Internet Explorer 中添加浏览器栏。如果你想向 Internet Explorer 的“工具”菜单中添加菜单项,首先应该熟悉注册表,还应该熟悉 band 对象。有关 band 对象的详细内容,可以参阅 SDK 中关于 Windows Shell API 的文档。   这讨论的实现方式对 Internet Explorer 5 以上版本有效。关

高级多宝平台编程序员 的专栏 517

IE探索之定制浏览器好助手

访问文档对象   现在 BHO 引用了 Internet Explorer 的 WebBrowser 控件并已经连接到浏览器 以接收它产生的事件。在 Web 页面被完全下载并被正确地初始化之后,现在终于可以通过 DHTML 文档对象模型访问它了。WebBrowser 的 Document 属性返回一个指向文档对象的 IDispatch 接口的指针:   CComPtr pDisp;

smallfish6的专栏 341

IE探索之定制浏览器好助手(下)

出处:http://www0.ccidnet.com/tech/web/2001/02/08/58_1642.htmlIE探索之定制浏览器好助手(下)(作者:青苹果工作室编译 2001年02月08日 14:00)访问文档对象   现在 BHO 引用了 Internet Explorer 的 WebBrowser 控件并已经连接到浏览器 以接收它产生的事件。在 Web 页面被完全下载并被

fengke的专栏 1320

IE探索之定制浏览器好助手(下) (转)

IE探索之定制浏览器好助手(下) (转)[@more@].NET.com/tech/web/2001/02/08/58_1642.html">出处:http://www0.ccidnet.com/tech/web/20...

ciya3282的博客 103

记一次vue3在ie11中空白问题的探索

我并没有解决这个问题,但说不定能给你提供一些思路… 我的项目使用vue-cli进行初始化的。看一下package.json的依赖项目: "dependencies": { "core-js": "^3.6.5", "vue": "^3.0.0" }, 其实并不止这两个依赖,vue3本身也依赖于别的项目: "dependencies": { "@vue/shared": "3.0.4", "@vue/compiler-dom": "3.0.4", "@vu

胡聊前端的博客 2154

解决IE9下external.menuArguments.location.href没有权限的问题

IE9下external.menuArguments.location.href权限问题

xuexplorer的专栏 3231

1992-2023年各省产业结构升级、产业结构高级化数据(含原始数据+计算过程+计算结果)(无缺失).xlsx

1992-2023年各省产业结构升级、产业结构高级化数据(含原始数据+计算过程+计算结果)(无缺失)1、时间:1992-2023年2、来源:国家统计J、统计NJ3、指标:国内生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业比重、第二产业比重、第三产业比重、产业结构升级、产业结构高级化4、范围:31省‘’5、计算说明:产业结构高级化=第三产业增加值/第二产业增加值产业结构升级=第一产业比重*1+第二产业比重*2+第三产业比重*36、缺失情况:无缺失

雷达系统设计matlab仿真.rar

雷达系统设计matlab仿真

上一篇: IIS4.0事件记录详解
下一篇: Java程序性能和速度优化实例
iBreathe
博客等级 码龄26年 3粉丝 65原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值