日期:2008-08-16  浏览次数:20850 次

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 的内容如下:

  

  这个脚本通过 external.menuArguments 获得上级