(原创不易,引用请注明作者、出处!)
插件是一种遵循统一的预定义接口规范编写出来的程序,应用程序在运行时通过接口规范对插件进行调用,以扩展应用程序的功能。插件在英文中通常称为plug-in、plugin或者plug in。插件最典型的例子是Microsoft的ActiveX控件和COM(Component Object Model,部件对象模型)实际上ActiveX控件不过是一个更高继承层次的COM而已。此外还有Photoshop的滤镜(Filter)也是一种比较常见的插件。
关于ActiveX和COM
在Microsoft的.Net Framework 推出的之前(大约是2003年之前吧),ActiveX和COM可是炙手可热的技术啊!在那个年代,一个顶尖的VC++高手的标志是什么?是会COM编程!不知道IUnknown接口和QueryInterface函数,你怎么可能通过Microsoft的MCSD认证考试?
现在当然不同了,我曾经见过不少断言COM和ActiveX已经消亡或终将消亡的文章。但是不管怎么说,个人认为,ActiveX和COM代表了插件技术的最高境界,通过对ActiveX和COM的研究,我们可以对插件有更深刻的认识。
关于ActiveX控件和COM技术的详细介绍,有兴趣的朋友不妨去“百度一下”,相信能够获得很多相关信息的。
插件技术过时了吗?
COM技术的逐渐淡出,使不少程序员产生了困惑:插件技术已经过时了吗?
NO!至少我不这样认为!毕竟,没有了插件技术,我们还有什么更好的方法为应用程序提供运行时的功能扩展呢?
COM的没落自然有其原因,例如编程实在是太复杂而难以掌握,还有就是在这个病毒和木马肆虐的年代,其安全性也令人堪忧。但至少我们可以看到,插件技术的成功应用还是有的:比如PhotoShop的滤镜,比如各大主流工控软件的功能扩展。
对于插件的理解,我们应该注意以下几点:
一、插件是遵循统一的预定义接口规范编写的。
下面我以微软的ActiveX Control Test Container为大家解释一下插件的接口定义。
1、打开VS.NET 2005;
2、点击主菜单的“工具”菜单;
3、如果在“工具”菜单中未找到“Activex Test Container”,则点击“工具”-〉“外部工具”,在“外部工具”对话框的“菜单内容”列表框中,选中“Activex Test Container",然后点击右上角的"添加“按钮,再点击左下角的”确定按钮“,此步骤将在在“工具”菜单中添加“Activex Test Container”菜单项;
4、点击主菜单的“工具->Activex Test Container”菜单项,运行”Activex Test Container" ;
5、在“Activex Test Container”程序中点击“编辑->插入新控件”菜单;
6、在“插入控件”对话框中找到“日历控件 11.0" 控件,点击确定;
7、点击“控件”-〉“调用”方法,弹出“调用方法”对话框,按下图所示的方法将日历控件的背景色设置为红色;
在这里,“BackColor”是一个预定义的通用的Activex控件接口函数,用于设置控件的背景颜色。
二、应用程序是在运行时调用插件以实现功能扩展的
插件最吸引人的地方当然就是其所实现“运行时(run-time)"功能扩展。这意味着软件开发者可以通过公布插件的预定义接口规范,从而允许第三方的软件开发者通过开发插件对软件的功能进行扩展,而无需对整个程序代码进行重新编译。
运行时(run-time)是相对于编译时(assembly-time)而言的。一般来说,软件开发者对软件功能更新时,是在源代码级别进行更新,然后对整个程序或部分动态链接库(DLL)进行重新编译,进而发布应用程序的新版本,这就是编译时(assembly-time)的软件更新。
三、插件技术的优缺点
运行时的软件功能扩展其优点是显而易见的:
1、对软件的开发者而言,只需对主程序和某些常用插件进行更新和维护,然后通过公布插件接口吸引第三方的软件开发者对主程序的功能进行扩展,这是一种“我为人人,人人为我”的双赢策略;
2、对最终用户而言,可以通过有选择地购买第三方提供的插件实现自己所需要的功能,从而实现最佳性价比组合,以节省不必要的开支。
但是,运行时的软件功能扩展也有其弊端:
1、为实现运行时的软件扩展,程序开发者必须编写更多、更复杂的代码,从而会对程序的执行效率产生一定的影响。关于这一点,我会在第二讲中详细论述;
2、由于插件是在运行时加载的,因此第三方插件可能对用户造成危害。这种危害通常可以分为两类:
(1)由于插件开发者的技术水平原因导致的插件BUG,这种BUG可能导致内存泄露、死机、数据丢失等等故障,从而影响到用户对软件的使用;
(2)插件开发者恶意开发类似于病毒和木马的插件,窃取或毁坏用户数据,使用户遭受不必要的损失;
为了避免此类缺点,软件开发者可能需要付出额外的代价,如需要对第三方插件进行检验和认证,或者干脆不对外提供插件开发接口,仅由自己提供插件。