IE里的探索之定制浏览器好助手(上2)

IObjectWithSite 接口
  从这个高层来看待浏览器助手对象,一个概念就清晰的显现出来了:BHO 是一个动态连接库 (DLL),它能附着在 Internet Explorer 的一个新实例上,在某些情况下,也能附着在 Windows Explorer 的实例上。这样的模块能通过容器的现场与浏览器建立联系。
  通常,现场是指处于容器和每个被包含的对象之间的中介对象。容器通过它管理包含的对象,并随后使对象的内置功能可用。这种容器和对象之间的基于现场的关系涉及到在容器一端实现像 IOleClientSite 这样的接口,以及在对象一端实现像 IOleObject 这样的接口。通过调用 IOleObject 上的方法,容器使对象知道它的宿主环境。
  当容器是 Internet Explorer (或支持 Web 的 Windows Explorer),从性能的角度考虑,需用将这种通讯模式降低到必要的程度。现在对象需要实现更简单更小的叫作 IObjectWithSite 的接口。它只需提供两个方法。

  表 3. IObjectWithSite 接口定义
  对 BHO 的唯一严格要求就是实现这个接口。注意你要避免从前面所说的函数中返回 E_NOTIMPL。你要么不去实现这个接口,要么正确地编写它的方法。
编写浏览器助手对象
  浏览器助手对象是进程内的 COM 服务程序,那么还有什么比 Active Template Library (ATL)更适合用来编写它呢?选择 ATL 的另一个原因是它已经默认提供了一个很好的 IObjectWithSite 接口。还有,在 ATL COM 向导内置支持的预定义对象类型中,有一个 Internet Explorer 对象,正好是 BHO 的对象类型。实际上,ATL Internet Explorer 对象是一个简单的对象。就是说,一个 COM 服务程序,支持 IUnknown 和自我注册加上 IObjectWithSite。如果你在 ATL 项目中添加一个这样的对象,并引用 CViewSource 类,你可以从向导中得到以下代码:
  class ATL_NO_VTABLE CViewSource :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CViewSource, &CLSID_ViewSource>,
   public IObjectWithSiteImpl<CViewSource>,
   public IDispatchImpl<IViewSource, &IID_IViewSource,
              &LIBID_HTMLEDITLib>
  像你看到的那样,向导已经使这个类继承 IObjectWithSiteImpl,它是提供 IObjectWithSite 的基本实现的一个 ATL 模板类。(参见 Microsoft Visual Studio 98 中 ATLINCLUDE 目录下的 atlcom.h。) 通常不需要重载 GetSite() 成员函数。相反,GetSite() 的已有代码常常(即使并不总是)需要按用户要求来重写。实际上,ATL 只是简单地将 IUnknown 指针保存到一个叫 m_spUnkSite 的成员变量里。

时间: 2024-10-22 21:39:01

IE里的探索之定制浏览器好助手(上2)的相关文章

IE里的探索之定制浏览器好助手(上1)

IE里的探索之定制浏览器好助手(作者:青苹果工作室编译 2001年02月08日 14:00) 有些情况下你需要特制的.或多或少有些改变的浏览器.这种情况下,你有时候会基于 WebBrowser 控件开发一个完全定制的模块,实现按钮.标题以及用户界面需要的其它东西.这时,你可以自由地在这个浏览器中添加任何新的.非标准的功能.WebBrowser 控件只是浏览器的语法分析引擎.这就是说还有很多用户界面相关的任务必须由你完成:添加地址栏.工具条.历史.状态栏.频道和收藏夹等等.所以,要创建定制的浏览器

IE里的探索之定制浏览器好助手(中1)

IE里的探索之定制浏览器好助手(中)(作者:青苹果工作室编译 2001年02月08日 14:00)检测调用者 像前面提到的,如果你运行的外壳版本不低于471,BHO 就既能被Internet Explorer又能被Windows Explorer引用.在这个例子里,我们要是涉及一个专对 HTML 页面起作用的助手对象,所以它应该对 Windows Explorer 不起任何作用.一个不想被特定的调用者加载的 DLL 可以在它发现谁是调用者后,简单地在它的 DllMain() 函数中返回 Fals

IE里的探索之添加浏览器栏

IE里的探索之添加浏览器栏(作者:青苹果工作室编译 2001年02月08日 13:28) 本文解释如何在 Microsoft Internet Explorer 中添加浏览器栏.如果你想向 Internet Explorer 的"工具"菜单中添加菜单项,首先应该熟悉注册表,还应该熟悉 band 对象.有关 band 对象的详细内容,可以参阅 SDK 中关于 Windows Shell API 的文档. 这里讨论的实现方式对 Internet Explorer 5 以上版本有效.关于如何

IE里的探索(想定制自己的IE的可以看一看)

IE里的探索(作者:青苹果工作室编译 2001年02月08日 14:06) Microsoft公司的Internet Explorer已经成为我们机器中必备的工具,只要一打开计算机,只要一上网,怎么会不双击那熟悉的E图标?但是我们对它的了解也许只停留在冰山一角的程度,我们希望添加.定制特殊的功能,以实现更加实用.更加强大的功能.本文就将全面介绍关于IE的高级定制功能,让我们更加充分地发挥其作用! 本文包括如下各节: 浏览器概览 向标准上下文相关菜单里添加条目 添加浏览器栏 添加工具条按钮 创建具

IE里的探索之浏览器概览

IE里的探索之浏览器概览(作者:青苹果工作室编译 2001年02月08日 13:28) 本节解释Microsoft Internet Explorer 4.0及更高版本的体系结构并提供使用它的组件时用到的信息,包括以下内容:* 体系结构概览:* 选择正确的组件:* 提供附加控制:* 控制上下文相关菜单:* 扩展动态 HTML 对象模型:* 控制下载:* 安全管理.体系结构概览 Internet Explorer 使用 Microsoft ActiveX 控件和 Active Document 接

IE里的探索之添加工具条按钮(1)

IE里的探索之添加工具条按钮(作者:青苹果工作室编译 2001年02月08日 13:28) 本文解释如何在 Microsoft Internet Explorer 的用户界面上添加工具条按钮.工具条按钮可以运行 Win32 应用程序.运行脚本或打开浏览器栏.注意:默认情况下,自定义工具条按钮不出现在 Internet Explorer 的工具条上.这些按钮将出现在"定制工具条"对话框的左侧. 如果你想向 Internet Explorer 中添加工具条按钮,就应该熟悉注册表和全局唯一标

在应用程序里识别UserAgent对应的浏览器

ASP.Net有很好的机制来识别用户的浏览器: 用Request.Browser就可以拿到一个 HttpBrowserCapabilities,然后用相应的属性可以取到值,比较浏览器类型,屏幕大小,JS支持等等. 对于移动设备更可以这么用,很容易拿到需要的属性(当然ASP.Net自带的浏览器库还是很不全). 但是怎样在WinApp里根据UserAgent识别浏览器呢?我通过Reflector看到主要是在 BrowserCapabilitiesFactory这个类中对浏览器的Capability进

IE里的探索之向标准上下文相关菜单里添加条目

IE里的探索之向标准上下文相关菜单里添加条目(作者:青苹果工作室编译 2001年02月08日 13:28) 本文描述在Microsoft Internet Explorer中执行URL指定的脚本时,如何向它的标准上下文相关菜单中添加菜单项. 如果你想向 Internet Explorer 的标准上下文相关菜单中添加菜单项,那么你应该熟悉注册表以及上下文相关菜单.有关上下文相关菜单的详细内容,可以参阅 SDK 中关于 Windows Shell API 的文档. 这里讨论的实现方式对 Intern

android源码探索之定制android关机界面的方法_Android

本文实例讲述了android源码探索之定制android关机界面的方法.分享给大家供大家参考.具体如下: 在Android系统中,长按Power键默认会弹出对话框让你选择"飞行模式","静音","关机"等功能.如下图所示: 但这些功能都对Android-x86和其他终端产品就没什么必要了.本文就简单介绍下如何定制关机界面. 我的目标是长按Power键,将会关机,弹出"设备将要关机"选择对话框.如果可以选择"是&quo