软件中的插件技术
插件的本质是在不修改程序主体的情况下对软件功能进行加强,当插件的接口被公开时,任何公司或个人都可以自己制作插件来解决一些操作上的不便或增加一些功能。比如我手头正在写的最新版本ENCounter,允许其他的软件接驳进来,驻留的程序可以只是ENCounter一个,但是当联网成功时,ENCounter可以除了记费外,还能呼叫其他的插件模块来执行诸如检查邮件等操作,这样比驻留一个ENCounter邮件检查软件更有效。
使用插件的软件中最成功的莫过于PhotoShop了。使用过PhotoShop的人对滤镜一定不陌生。即使是初涉图形制作的生手,只要去获取一些好的滤镜,也能够轻易地作出特殊效果。另一套著名的使用插件机制的软件是WinAmp,WinAmp早期的成功虽然在于其快速的解码引擎,但在MP3播放器中能够保持长久的霸主地位,也正是由于内置了健全的Skin和PlugIn(插件)。细心的朋友一定注意到了,后期的WinAmp中增加的MIDI、MOD、WAVE等音乐格式的播放功能完全是靠插件实现的。
插件还可以支持多人合作开发,只要有一个好的插件机制,不同的功能可以由不同的人来完成,而且由于不同插件之间互不影响,方便程序的调试和纠错。
#1 插件类型
从广义的范围来看,插件有以下三种类型:
1.类似批命令的简单插件。事实上这种插件的自由度非常低。使用这种方法的软件有Win Hacker等,运行这种插件后,会一步步要求用户进行选择/输入,最后根据用户的输入来执行一系列事先定义好的操作。这种插件一般是文本文件。功能比较单一,可扩展性极小。优点是插件做起来非常方便,即使是对程序设计了解不多的人也可以制作。如WinAmp的Skin。
2.使用一种特殊的脚本语言来实现的插件(暂时称为脚本插件)。这种插件比较难写,需要软件开发者自己制作一个程序解释内核。比如微软惹了很多麻烦的宏就是这种类型的。有一套著名的Office辅助工具就是完全用Office内置的VBScript写成的。这种方法的优点在于无需使用其它工具来制作插件,软件本身就可以实现,普遍出现于各种办公自动化软件中。
3.利用已有的程序开发环境来制作插件。例如PhotoShop等软件使用的方法。使用这种方法的软件在程序主体中建立了多个自定义的接口,使插件能够自由访问程序中的各种资源。这种插件的优势在于自由度极大,可以无限发挥插件开发者的创意,这种插件是狭义范围的插件,也是真正意义上的插件。而这种插件机制的编写相对复杂,对于插件接口之间的协调比较困难,插件的开发也需要专业的程序员才能进行。
#1 插件实例
网页作坊(HTML SHOP)是我国第一个使用插件机制的共享软件。(^161301a^)
以下我们将以HTML SHOP为例子,来深入了解插件机制的开发:
在软件中添加插件机制,首先需要进行详细的应用分析,确定应该提供哪些资源给插件开发者使用。HTML SHOP作为一个网页编辑器,对网页的编辑是建立在“计划”的基础上的,因此,我们必须提供给插件开发者访问当前打开计划信息的能力,能够自由地读取和写入的能力。
为了让插件提供的功能能够被用户方便调用,必须将主菜单的控制权与插件开发者共享,而网页作坊的程序界面模仿了经典软件开发环境Delphi 3.0,因此我们同时将工具条中的标签页组的权利提供给插件开发者。这个应用分析部分是插件机制开发的重头,是最难把握的部分,如果提供出来的权利太大,写得拙劣的插件发生错误时可能威胁到主程序,如果提供出来的权利太小,又限制了插件开发者的想象力。
在编程方面包括了两个部分,一部分是主体程序的插件处理机制,用来进行初始化每个插件的过程,并且管理好每个插件接口,在插件访问时能够做出正确的反馈。另一部分是插件的接口函数定义,将所有的插件接口函数进行封装,以便开发者自由调用。在HTML SHOP中,这部分的封装文件是HBPlugin.pas,当开发者在程序中引用了该文件时,就可以直接调用其中的TOOLHOST对象,使用封装于该对象的插件接口函数。
而最重要的部分当然是插件和主程序之间的通讯了。在网页作坊中的插件其实是一个遵循了某些特定规则的DLL,而主程序将所有插件接口在内存中的地址传递给插件,插件则根据这些地址来呼叫插件接口完成所需功能、获取所需资源等。