Electronic Joint Business

Solution for E-Business

浏览器插件

用Visual Studio开发Firefox扩展 (一) 简介与准备

Firefox插件简介
Extension就是一个zip包,里面有规定的一些必要文件。这个可以下载几个插件看一下他们的目录结构就好了。我下载了一个 QuickNote,看了一下,主要包括一个install.rdf(安装包相关信息和文件资源路径等配置)、chrome.manifest(设置各种 XUL文件路径以及其他的一些资源文件路径)、chrome文件夹(里面放着插件的所有源文件),不过chrome文件夹里面的文件我还没有过多研究。

Plugin好像是另外一码事了,在Mozilla Developer Center的Plugin开发介绍文中有这么一句:Plugins are different from extensions, which modify or enhance the functionality of the browser itself. Plugins are also different from search plugins, which plug additional search engines in the search bar. (插件与扩展不同,它更改或者改善了浏览器自身的功能。插件与搜索插件又不同,搜索插件在搜索工具栏上添加了额外的搜索引擎。)

我的理解,插件可以让你在FF中使用自己的View来展示、用自己编写的二进制文件来做某些事情,不仅仅是利用FF自身支持的一些特性和功能。而扩展相对来说就不需要这些东西,只利用FF的开发API就好了。Firefox插件,也叫Mozilla插件,它是一段程序。通常,界面使用XUL语言(XML的一个子集)或者XUL内嵌HTML编写,而程序逻辑使用ECMAScript (Standard ECMA-262)(俗称JavaScript)编写。

XUL可以是独立的窗体,可以是对话,也可以是overlay。Overlay可以用于修改已经构建好的界面。下面是一段示例的XUL代码:

<overlay id="main-overlay" xmlns:html="http://www.w3.org/1999/xhtml"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <menu id="file_menu">
  <menuitem name="Example One"/>
  <menuitem name="Example Two"/>
  <menuitem name="Example Three"/>
  <menuitem name="Example Four" position="1"/>
 </menu>
</overlay>

而JavaScript可以用来定义程序的行为。CSS可以用于自定义样式,而XPCOM可以用于调用Firefox提供的接口。另外,现在有一些JavaScript Library,可以直接使用而降低代码难度。

>>> 阅读全文

 

, , , , , , ,

用C#编写 IE BHO

在前面几篇文章都是用 VC++ 完成的,为了更加快开发速度,很多程序员会考虑使用 C# 等更便捷的开发方式,这里我们采用 Visual Studio 2010 作为开发工具,你也可以采用 Visual studio 2008,其界面和开发过程与 Visual Studio 2010 类似。

这儿, 我们也简单介绍一下 BHO. BHO 是将自定义功能添加到 Internet Explorer 的轻型 DLL 扩展,除了 IE, BHO 还可以将功能添加到 Windows 资源管理器外壳程序. BHO 通常并不提供其自身的任何用户界面 (UI)。它们而是通过在后台响应浏览器事件和用户输入数据来发挥作用。例如,BHO 可以拦截弹出窗口、自动填充窗体或为鼠标手势添加支持。

在阅读本文之前,建议安装 Visual studio 的 SDK,因为里面提供了包装了 OLE 的装配件, >> 点击下载。如果觉得 Visual Studio SDK 安装包太庞大, 本文也提供了需要几个 OLE 接口的C#源代码。

我们知道,BHO 的生命周期与它所交互的浏览器实例的生命周期相等。在 IE 6 和早期版本中,这意味着要为每个新的顶层窗口创建(和销毁)一个新 BHO。在IE 7中则是为每个选项卡都创建和销毁一个新 BHO。

BHO 必须实现 IObjectWithSite 接口, 该接口提供了两个方法GetSite和SetSite。请在项目中引用” Microsoft.VisualStudio.OLE.Interop “这个装配件。如果没有安装 Visual Studio SDK, 你可以在项目中加入这段 IObjectWithSite 接口的源代码。

>>> 阅读全文

 

, , , ,

用Visual Studio 2008开发IE浏览器帮助对象 之三

接下来,我们要为IE增加一个按钮(注意不是toolbar,toolbar要复杂得多),基本这是一个注册表的魔术.打开RayBHO.rgs, 添加

HKLM
{
        NoRemove Software
        {
                NoRemove Microsoft
                {
                        NoRemove ‘Internet Explorer’
                        {
                                NoRemove Extensions
                                {
                                        ForceRemove ‘{1AC31710-6759-484f-A129-A70C55485DA1}’
                                        {
                                                val ButtonText = s ‘Hello,World’
                                                val Icon = s ‘%MODULE%,201’
                                                val HotIcon = s ‘%MODULE%,202’
                                                val CLSID = s ‘{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}’
                                                val ClsidExtension = s ‘{057F3E68-6C2E-40A5-A641-E8CF9D6766F3}’
                                                val ‘Default Visible’ = s ‘yes’
                                        }
                                }
                        }
                }
        }
}

当然,你也可以把这一项放在HKCU(Current User)下,这样的话,该Button只对当前用户起作用。这些注册表项说明如下:

ForceRemove ‘{1AC31710-6759-484f-A129-A70C55485DA1}’ 该extersion的CLSID,请自己用GUID这个程序生成.
val ButtonText = s ‘Hello,World’ // 按钮上的文字说明
val Icon = s ‘%MODULE%,201’ // 按钮的图标,可以是icon的绝对路径,也可以和我的例子一样从资源文件里加载.
val HotIcon = s ‘%MODULE%,202’// 鼠标悬停时按钮的图标,与Icon类似.
val CLSID = s ‘{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}’ //该CLSID意思为可执行,此值有特定含义,请小心修改.
val ClsidExtension = s ‘{057F3E68-6C2E-40A5-A641-E8CF9D6766F3}’ // 这个是RayBHO的CLSID,即表示该按钮的动作连接到RayBHO这个com上,具体值有所不同,必须查询你自己的rgs文件得到.
val ‘Default Visible’ = s ‘yes’//按钮可见.

当然你也可以不使用COM来响应按钮的动作,另外两个键Exec和Script,可以设置响应的程序或者脚本..这个不是重点.现在编译,然后从IE的自定义工具栏将这个按钮拖出来…如图所示:

点点看…..结果呢? 当然是不起作用!

>>> 阅读全文

 

, , ,

用Visual Studio 2008开发IE浏览器帮助对象 之二

上一篇文章开发的RayBHO只是BHO的一个框架,根本不具备任何功能. 在这篇文章里,我们将使继续扩展这个BHO,让它具备更强的功能.首先我们学习如何让BHO接收IE的事件通知,接者学习为ie添加一个按钮,并让BHO对按钮做出响应. 要让BHO能接收事件通知, 它必须让处理函数与浏览器事件建立连接点. 为响应这些事件,它必须实现IDispEventImpl, ATL提供了一个默认实现,可以帮助简化这个事件处理逻辑。 在RayBHO.h添加: #include "exdispid.h" #include "shlguid.h" 我们的CRayBHO必须派生自IDispEventImpl,修改后的代码如下: class ATL_NO_VTABLE CRayBHO :  public CComObjectRootEx,  public CComCoClass,  public IObjectWithSiteImpl,  public IDispatchImpl,  public IDispEventImpl&lt;1,CRayBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,1>; DispEventImpl为处理事件提供了一种简单安全的方法。 IDispEventImpl与事件路由表配合工作,可以将事件路由到相应的处理程序函数。在例子中,我们将”DocumentComplete”的事件交由OnDocumentComplete函数进行处理. 在public段添加路由表: BEGIN_SINK_MAP(CHelloWorldBHO) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete) END_SINK_MAP() 上述声明中SINK_ENTRY_EX(1,…)中的”1″与接口声明中的IDispEventImpl<1,….>是对应的,在必要时可以用于区分来自不同接口的事件.

 

, , ,

用Visual Studio 2008开发IE浏览器帮助对象 之一

这篇文章是应同学们的要求写的,以前都是用 VC++ 6.0 和 Platform SDK 完成的. 迁移到 VS2008之后,原来 Visual Studio 6.0里的 BHO 向导不复存在,因此特此不厌其烦,详细说明,本文也适用于 VS2005.

BHO 简介和开发工具
首先谈 BHO 的开发工具,我偏向使用 VC++(unmanaged C++) 作为开发工具,因为 Java JVM 或 .Net CLR 的虚拟机是个很笨重的东西,也是内存杀手, 并不具备写 plugin 的快捷轻巧的特点.个人并不喜欢将其作为 Plug-in 的开发平台,不过我会有另文说明用 C# 开发 BHO 的全过程, 作为那些偏重开发效率的同学的参考.
其次是类库的选择,我倾向利用“活动模板库”(ATL) 来开发使用 C++ 的 BHO。之所以使用 ATL,是因为它方便地实现了我们可以按需进行扩展的基本样板。尽管使用“Microsoft 基础类”(MFC) 或 Win32 API 和 COM)也可以创建BHO,但 ATL 是为我们提供了自动处理许多细节的轻型库,包括建立含有 BHO 类标识符 (CLSID) 的注册表。

ATL 的另一个优势在于它的 COM 智能感知指针类(例如,CComPtr 和 CComBSTR),这些类可管理 COM 对象的生命周期。例如,CComPtr 在赋值时会调用 AddRef,而在对象被销毁或超出范围时会调用 Release。智能指针简化了代码并且有助于避免内存泄漏。当在单个方法范围内使用时,它们的稳定性和可靠性尤为有用。

介绍完ATL, 我们也简单介绍一下 BHO. BHO 是将自定义功能添加到 Internet Explorer 的轻型 DLL 扩展,除了 IE, BHO 还可以将功能添加到 Windows 资源管理器外壳程序.

 BHO 通常并不提供其自身的任何用户界面 (UI)。它们而是通过在后台响应浏览器事件和用户输入数据来发挥作用。例如,BHO 可以拦截弹出窗口、自动填充窗体或为鼠标手势添加支持。

>>> 阅读全文

 

, , , , ,