IE和Outlook Express的翻译插件设计

IE和Outlook Express的翻译插件设计

摘要:本文主要介绍了在IE和Outlook Express中加入翻译插件的设计过程。对于IE,插件开发主要采用创建BHO对象,浏览器调用过程中载入COM组件DLL文件来实现,翻译部分涉及到两部分:一是网页HTML源码文本的分析提取,二是调用翻译引擎生成包含译文的目标HTML文件。对于Outlook Express,本文采用的是程序注入式方式的插件开发,采用了Nektra公司的OEAPI库函数编写翻译插件,翻译部分也涉及到两部分:一是OE的邮件格式解码处理,二是调用翻译引擎生成包含译文的目标邮件。

关键词:翻译插件,IE,Outlook Express,HTML分析,邮件解码

Plug-ins Design For IE & Outlook Express

Abstract: This paper introduces how to plug the translate-plug-in into IE & Outlook Express. For IE, the plug-in mainly depends on the creating of the BHO object and loading the DLL file of COM component during the IE launching. Translation procedure refers to two parts: the analyses of HTML source file and the calling of translation engine to build the target HTML file. For Outlook Express, the plug-in uses the program injection, coding with the library of OEAPI, Nektra Corporation. Translation procedure also refers to two parts: the decoding of OE email format and the calling of translation engine to build the target email file.

Key Words: Translate-Plug-in, IE, Outlook Express, HTML analyze, Email decode

  目录

一、引言 

 二、IE浏览器插件开发

2.1 IE插件开发方法介绍 

2.2 IE翻译插件的设计 

2.3 IE翻译插件的实现 

2.3.1 与IE进行COM通信的主要函数

2.3.2 网页内容翻译的实现 

2.3.3 注册表项修改 

三、Outlook Express插件开发 

3.1 OEAPI介绍 

3.2 Outlook Express翻译插件设计 

3.3 Outlook Express翻译插件实现 

3.3.1 OEAPI中重载函数的实现 

3.3.2 邮件格式分析 

四、实现效果

五、总结 

参考文献 

致谢 

一、引言

因特网(Internet)的快速发展极大地加速了全球范围内的信息交换,只需借助一个Web浏览器,人们就能轻松方便地获得世界各地的数据和信息。在人们享用Internet所带来的巨大便利时,常会遇到一个语言障碍问题,世界各国有各自不同的语言,Internet上由不同国家提供的Web页面包含了不同种类的语言文字,当人们没能掌握某种语言时,也就无法理解该语言的Web页面。因此,对网上的页面进行翻译就显得十分必要。

上网人们最长用到的两个功能就是网页浏览和电子邮件收发。而这其中又以Microsoft公司的Windows操作系统自带的Internet Explorer(简称IE)和Outlook Express(简称OE)最为流行。所以在这两款软件基础上开发的插件能够拥有较多的用户群体。    

针对IE和OE开发的插件是目前比较热门的技术。本文主要针对IE和OE的翻译插件设计分别加以讨论研究,给出其设计思想和框架结构,然后对实现上的细节进行分析,最后给出实现效果。

二、IE浏览器插件开发

目前有许多技术、工具可以用来定制IE浏览器,从IE3.0开始提供WebBrowser control,从IE4.0开始提供Browser Helper Objects(BHOs),这些都是让开发人员用来定制IE的。从IE5.0开始支持增加工具条按钮和菜单项,以及右键点击弹出的菜单项(context menu)。目前定制IE6.0浏览器设计四种元素:COM组件,HTML,Script文件,注册表。向注册表里添加一些Keys和Values,写一个特定的COM组件或脚本文件,就可以定制IE界面了。

2.1 IE插件开发方法介绍

(1)BHO对象/COM组件

基本上,与IE相关的COM对象有四种类型:BHOs,带定制命令的BHOs,command-only objects, Explorer deskband。BHO是一个简单的COM服务器,只需实现IObjectWithSite接口即可。BHOs并不和用户界面相连,它只是在浏览器启动时起作用。BHOs会收到一个指向浏览器IUnknown接口的指针。

如果要往浏览器里添加命令,那么在写BHOs或COM组件时需要实现IOleCommandTarget接口,IE通过这个接口来实现和组件交互并执行某项功能。这种组件需要和一个菜单项或一个工具条按钮联系起来工作。

COM是面对对象的软件模型,接口是一组逻辑上相关的函数集合。在COM标准中,一个组件程序也被称为一个模块,它可以是一个动态连接库(DLL), 被称为进程内组件(in-of-process component)也可以是一个可执行程序(EXE),被称为进程外组件(out-of-process component)。OLE技术以COM规范为基础,OLE充分发挥了COM标准的优势,使Windows操作系统上的应用程序具有极强的可交互性。[1]

(2)工具条添加按钮

要往IE工具条上添加按钮,需要向注册表里添加条目,内容包括使用何种图标,显示文字内容,点击按钮时所作的动作等。每个工具条有其对应的菜单项,可以在注册表中加以说明。定义一个新按钮需要两种信息:配置和动作设定。所有条目都是字符串(REG_SZ类型)。如果Default Visible设为No,则该按钮不会出现在工具条上,不过在工具条的定制对话框中可以看到。如果用户先前定制过工具条,则无论Default Visible的值是什么,按钮都不会自动出现在工具条上。

Clsid条目的值是一个GUID,这里使用的是IE浏览器默认工具条的值{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}。按钮的动作设定有三种选择:运行一个可执行文件,打开一个脚本或HTML页面,或者引发一条命令,该命令定义在某个实现了IOleCommandTarget接口的COM组件中。如果要运行一个可执行文件,需要在注册表中添加一个名字为Exec的value,内容为可执行文件的全路径名,但是不能指定命令行参数。

如果要执行一个VB脚本或java脚本,仍是用Exec,如果要打开一个HTML页面,value的名字要改用Script。两种情况的区别是:Exec意味着指定的文件是由它的关联程序所执行的。如果在Exec中指定一个HTML文件,则会启动默认浏览器去浏览该页面。如果在Exec中指定一个.vbs或.js脚本文件,那么只是简单的执行其中的代码。脚本文件作为单独可执行文件运行时,不能得到当前浏览器的实例和由当前正被浏览的文档所暴露出来的对象模型。如果想使用这些对象,需要写一个HTML文件,其中仅包含脚本代码,并用Script来执行。[2]

 若把IE工具条按钮连接到一个COM对象上,添加的value名字为ClsidExtension,其内容是实现了IOleCommandTarget接口的COM对象的CLSID。

(3)重要接口介绍

IObjectWithSite接口

一个场所(site)是一个中间对象,它位于容器对象和被包容对象之间。通过它,容器对象管理被包容对象的内容,也因此使得对象的内部功能可用。因此,容器方要实现接口IOleClientSite,被包容对象要实现接口IOleObject。通过调用IOleObject提供的方法,容器对象使得被包容对象清楚地了解其HOST的环境。如果容器对象是IE,则被包容对象只需实现一个轻型的IObjectWithStie接口。该接口提供了一下两个方法:SetSite和GetSite。SetSite是用来接收IE浏览器的IUnknown指针,保存该指针以备将来使用。GetSite是从通过SetSite方法设置的场所中接收并返回指定的接口,用来查询前面保存的接口指针以进一步取得指定的接口。插件制作的关键是存取IE的浏览机制。 [3]

IOleCommandTarget接口

IoleCommandTarget接口提供了QueryStatus和Exec方法,QueryStatus方法主要用于实现查询一个OLE对象,返回采用IOLECommandTarget接口命令的状态。Exec方法用于接受IE扩展菜单命令。QueryStatus方法会被IE调用来获得当前菜单的状态,我们需要返回 OLECMDF_ENABLED或者其它值来表示是否允许点击。Exec()函数则是功能的实现。

2.2 IE翻译插件的设计

IE翻译插件主要功能是:

(1)点击翻译按钮后调用翻译程序对当前页面进行翻译,结果在新页面中显示,系统应能对原文页面作出实时快速的翻译,有多种语言翻译能力,系统一般针对特定的语言使用者,所以更多的情况是多种源语言到一种目标语言(用户语言)的翻译。

(2)原文页面和译文页面的对照显示功能。系统应能支持原文页面和翻译结果页面(以下简称译文页面)的对照显示,并且译文页面应在风格上与原文页面保持一致:包括页面布局的一致和图象、动画等页面元素的正常显示,同时译文页面要实现与原文页面一样的数据交互和链接导航等功能。根据上面插件常用方法介绍来看,这里采用的是在IE默认工具条上添加一个按钮,按钮点击后引发一条命令,由COM组件来执行。基本执行过程如下图1:

  图1 IE翻译插件框架设计

2.3 IE翻译插件的实现

 根据翻译插件的基本要求,本文设计开发了一个基于Windows平台和IE的Internet翻译插件。插件利用Visual C++ 6.0的ATL库进行编写,通过IE调用COM组件的执行部分DLL文件来实现基本功能。

 VC6.0建立一个ATL工程,这里向导已经使类从接口IObjectWithSiteImpl继承,这是一个ATL模板类,它提供了接口IObjectWithSite的基本实现。一般情况下,没有必要重载成员函数GetSite()。不过SetSite()实现代码需要加以定制。在translate.h中添加支持的接口IOleCommandTarget。

2.3.1 与IE进行COM通信的主要函数

(1)SetSite()方法

这是COM对象被初始化的地方,在这里要取得指向浏览器的指针。这里就是IWebBrowser2的指针。利用ATL灵敏指针先从IUnknown取得IServiceProvide,再利用QueryService()取得 IWebBrowser2。获得了IWebBrowser2指针后,下面的工作就好做了。这块的代码如下表1:

STDMETHODIMP Ctranslate::SetSite(IUnknown *pUnkSite)

{

    if (pUnkSite != NULL)

    {

        // 检索并存储 IWebBrowser2 指针 

        CComQI
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值