论文部分内容阅读
我们的日常生活已越来越离不开网络,上网自然离不开网络浏览器,而说到浏览器则又不得不涉及微软的Internet Explorer(以下简称IE),目前来说浏览器市场它依然是老大。相对应的,IE插件开发也就生财有道了,随意打开一个威客网站搜索“IE插件”,都可以找到许多相关的任务。所以,今天我们就来聊聊IE插件开发的话题。
【芝麻开门】
在开始之前,有必要对BHO这个概念有所了解。BHO是Browser Help Objects(浏览器助手对象)的简称,它实际就是实现了特定接口的COM组件。开发好的BHO插件在注册表特定的位置注册好后,每当IE启动,BHO实例就会被创建。在浏览器工作的过程中,BHO会接收到很多事件,比如浏览器浏览新的地址、前进或后退、生成新的窗口、浏览器退出等等。BHO可以在这些事件的响应中实现与浏览器的交互(见图1)。
人物专访
本期我们请到的,是2009年金山Office软件插件大赛金奖得主朱雄杰(小笨象)。他不仅擅长Office的插件开发,对IE插件开发也颇有研究。其实从这一点也可以看出,不同类型的插件开发实际也有很多共同的思路。
CFan:为什么在Office之外,您还选择了IE这个平台?
朱雄杰:网络相关开发,是程序员必然要关注到的一个发展方向。而网络开发则与浏览器有着千丝万缕的联系。如下图所示,是权威调研机构Net Applications公布的今年三月份浏览器的市场份额,可见IE占有绝对优势(含以IE为核心的其他第三方浏览器)。
面对这种情况,任何一家依靠网络生存的公司都不敢忽略IE。所以,依靠IE,通过IE来扩展自己的知名度,提供服务,自然就成了这些公司的首要选择。就算是出品了Chrome浏览器的Google公司,他们也为IE专门制做了IE工具栏插件等来宣传自己,提供更多方便快捷的服务。而国内的网上银行,基本上都是以IE插件(ActiveX)的形式来进行交易处理的。
CFan:IE插件开发的前景如何?
朱雄杰:微软为IE开设了专门的插件网站:http://www.ieaddons.com/cn/。微软根椐不记实名的遥测数据显示,每位IE8用户平均拥有五六个已安装的插件,从这个数据可以略窥此市场需求。而根椐国内的统计数字显示,国内的插件联盟做得量大的月收入几十万很普遍,做得好的会员月收入几万是很轻松的。大树底下好乘凉,咱们做为软件开发人员,自然不能不上前乘凉的。
【任务实战】
首先确定我们今天的实战任务:鼠标手势。在基于IE的第三方浏览器中(如傲游等),都可以看到这个功能扩展,即用户按住鼠标右键不放,然后画一个相应的手势即可执行一定的功能,如前进、后退、刷新、关闭当前窗口、向下向上滚动等。但IE本身却反而没有这一功能(看来真是店大欺客啊)。因此,网络上也有人开发了相应的IE插件来实现这个功能,但是因为添加的其他功能太杂,导致IE不稳定,而我们只想要鼠标手势而已,干脆自己开发一个吧,就此还可以了解IE插件开发原理,为开发其他类型插件打好基础。
浏览器助手对象是进程内的COM服务程序,那么还有什么比Active Template Library(ATL)更适合用来编写它呢?启动C++Builder,点击“新建”菜单,选择“ActiveX”项中的“ActiveX Library”,生成ActiveX工程(见图2)。并保存该工程为:IEME.cbproj(意为:IE鼠标增强)。
然后再打开“新建”菜单,选择“ActiveX”项中的“Automation Object”并点击“OK”生成COM工程代码。
接下来输入COM类的名称(本例为:IEMEX),点击“确定”,并保存为文件“IEMEXAddin.cpp”。
工程建立之后需要注意一点,因为在Windows系统中,资源管理器与IE都是使用IE内核来展现内容的,所以我们需要判断一下调用者是谁。在“IEME.CPP”中的DLL入口函数中判断一下。
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if (reason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hinst);
DisableThreadLibraryCalls(hinst);
//判断是否是资源浏览器的调用。
TCHAR pszLoader[MAX_PATH];
GetModuleFileName(NULL, pszLoader, MAX_PATH);
_tcslwr(pszLoader);
if (_tcsstr(pszLoader, _T("explorer.exe")))
return FALSE;
}
return TRUE;
}
同时,我们需要在这个插件DLL从IE中注册或者卸载时,自动添加相应的项值到注册表中,可添加InstallToIE()函数并添加到注册与卸载函数中。因为代码太长,这里仅就一些关键点做出说明,完整的代码包,可从http://work.newhua.com/cfan/201010/IEME.zip处下载,后面不再重复说明了。
pif->RootKey=HKEY_LOCAL_MACHINE; //定义注册表根键
pif->CreateKey("{88A03AD1-5ECA-4D8B-952D-400911740189}"); //创建注册表项
pif->DeleteKey("{88A03AD1-5ECA-4D8B-952D-400911740189}"); //删除注册表项
上面函数中的GUID值,可以从IEME.tlb中的Attributes中取得(见图3)。
然后把关键的类文件“IEX_IdentifyGesture.cpp”添加到本工程中,并在“IEMEXAddin.h”中加入相应的语句。重复代码不再粘贴,以下仅列出增加或改变的代码:
public IObjectWithSiteImpl, //我们添加的
TIEMEXImpl(); //我们修改了
~TIEMEXImpl(); //我们添加的
COM_INTERFACE_ENTRY(IObjectWithSite) //我们添加的
COM_INTERFACE_ENTRY2(IDispatch, IIEMEX) //我们添加的
STDMETHODIMP (SetSite) ( IUnknown* pUnkSite ); //我们添加的
并在“IEMEXAddin.cpp”中实现相应的方法即可。注意,为了方便用户辩识我们的插件,最好加上DLL的版本信息。可以通过菜单“Project→Options”来设置工程的版本信息(见图4)。
所有的代码工作完成,就需要注册到IE中了。单击“开始→运行”,输入“regsvr32 XXXX\IEME.dll”(不含外侧引号,XXXX是插件所在的目录),按回车键后就会提示注册成功。如果想卸载插件,则输入执行“regsvr32 /u XXXX\IEME.dll”命令即可。
这时重新启动IE,按下鼠标右键,然后向下向右划线。怎么?IE自动关闭了!那就对了,哈哈,我们就是设置了向右下划线是关闭当前IE的。本文提供实例包,支持的手势如下:
如果你使用的是IE8,可以通过IE8的“工具→管理加载项”来查看我们的插件是否安装启用了(见图5)。
【芝麻开门】
在开始之前,有必要对BHO这个概念有所了解。BHO是Browser Help Objects(浏览器助手对象)的简称,它实际就是实现了特定接口的COM组件。开发好的BHO插件在注册表特定的位置注册好后,每当IE启动,BHO实例就会被创建。在浏览器工作的过程中,BHO会接收到很多事件,比如浏览器浏览新的地址、前进或后退、生成新的窗口、浏览器退出等等。BHO可以在这些事件的响应中实现与浏览器的交互(见图1)。
人物专访
本期我们请到的,是2009年金山Office软件插件大赛金奖得主朱雄杰(小笨象)。他不仅擅长Office的插件开发,对IE插件开发也颇有研究。其实从这一点也可以看出,不同类型的插件开发实际也有很多共同的思路。
CFan:为什么在Office之外,您还选择了IE这个平台?
朱雄杰:网络相关开发,是程序员必然要关注到的一个发展方向。而网络开发则与浏览器有着千丝万缕的联系。如下图所示,是权威调研机构Net Applications公布的今年三月份浏览器的市场份额,可见IE占有绝对优势(含以IE为核心的其他第三方浏览器)。
面对这种情况,任何一家依靠网络生存的公司都不敢忽略IE。所以,依靠IE,通过IE来扩展自己的知名度,提供服务,自然就成了这些公司的首要选择。就算是出品了Chrome浏览器的Google公司,他们也为IE专门制做了IE工具栏插件等来宣传自己,提供更多方便快捷的服务。而国内的网上银行,基本上都是以IE插件(ActiveX)的形式来进行交易处理的。
CFan:IE插件开发的前景如何?
朱雄杰:微软为IE开设了专门的插件网站:http://www.ieaddons.com/cn/。微软根椐不记实名的遥测数据显示,每位IE8用户平均拥有五六个已安装的插件,从这个数据可以略窥此市场需求。而根椐国内的统计数字显示,国内的插件联盟做得量大的月收入几十万很普遍,做得好的会员月收入几万是很轻松的。大树底下好乘凉,咱们做为软件开发人员,自然不能不上前乘凉的。
【任务实战】
首先确定我们今天的实战任务:鼠标手势。在基于IE的第三方浏览器中(如傲游等),都可以看到这个功能扩展,即用户按住鼠标右键不放,然后画一个相应的手势即可执行一定的功能,如前进、后退、刷新、关闭当前窗口、向下向上滚动等。但IE本身却反而没有这一功能(看来真是店大欺客啊)。因此,网络上也有人开发了相应的IE插件来实现这个功能,但是因为添加的其他功能太杂,导致IE不稳定,而我们只想要鼠标手势而已,干脆自己开发一个吧,就此还可以了解IE插件开发原理,为开发其他类型插件打好基础。
浏览器助手对象是进程内的COM服务程序,那么还有什么比Active Template Library(ATL)更适合用来编写它呢?启动C++Builder,点击“新建”菜单,选择“ActiveX”项中的“ActiveX Library”,生成ActiveX工程(见图2)。并保存该工程为:IEME.cbproj(意为:IE鼠标增强)。
然后再打开“新建”菜单,选择“ActiveX”项中的“Automation Object”并点击“OK”生成COM工程代码。
接下来输入COM类的名称(本例为:IEMEX),点击“确定”,并保存为文件“IEMEXAddin.cpp”。
工程建立之后需要注意一点,因为在Windows系统中,资源管理器与IE都是使用IE内核来展现内容的,所以我们需要判断一下调用者是谁。在“IEME.CPP”中的DLL入口函数中判断一下。
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if (reason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hinst);
DisableThreadLibraryCalls(hinst);
//判断是否是资源浏览器的调用。
TCHAR pszLoader[MAX_PATH];
GetModuleFileName(NULL, pszLoader, MAX_PATH);
_tcslwr(pszLoader);
if (_tcsstr(pszLoader, _T("explorer.exe")))
return FALSE;
}
return TRUE;
}
同时,我们需要在这个插件DLL从IE中注册或者卸载时,自动添加相应的项值到注册表中,可添加InstallToIE()函数并添加到注册与卸载函数中。因为代码太长,这里仅就一些关键点做出说明,完整的代码包,可从http://work.newhua.com/cfan/201010/IEME.zip处下载,后面不再重复说明了。
pif->RootKey=HKEY_LOCAL_MACHINE; //定义注册表根键
pif->CreateKey("{88A03AD1-5ECA-4D8B-952D-400911740189}"); //创建注册表项
pif->DeleteKey("{88A03AD1-5ECA-4D8B-952D-400911740189}"); //删除注册表项
上面函数中的GUID值,可以从IEME.tlb中的Attributes中取得(见图3)。
然后把关键的类文件“IEX_IdentifyGesture.cpp”添加到本工程中,并在“IEMEXAddin.h”中加入相应的语句。重复代码不再粘贴,以下仅列出增加或改变的代码:
public IObjectWithSiteImpl
TIEMEXImpl(); //我们修改了
~TIEMEXImpl(); //我们添加的
COM_INTERFACE_ENTRY(IObjectWithSite) //我们添加的
COM_INTERFACE_ENTRY2(IDispatch, IIEMEX) //我们添加的
STDMETHODIMP (SetSite) ( IUnknown* pUnkSite ); //我们添加的
并在“IEMEXAddin.cpp”中实现相应的方法即可。注意,为了方便用户辩识我们的插件,最好加上DLL的版本信息。可以通过菜单“Project→Options”来设置工程的版本信息(见图4)。
所有的代码工作完成,就需要注册到IE中了。单击“开始→运行”,输入“regsvr32 XXXX\IEME.dll”(不含外侧引号,XXXX是插件所在的目录),按回车键后就会提示注册成功。如果想卸载插件,则输入执行“regsvr32 /u XXXX\IEME.dll”命令即可。
这时重新启动IE,按下鼠标右键,然后向下向右划线。怎么?IE自动关闭了!那就对了,哈哈,我们就是设置了向右下划线是关闭当前IE的。本文提供实例包,支持的手势如下:
如果你使用的是IE8,可以通过IE8的“工具→管理加载项”来查看我们的插件是否安装启用了(见图5)。