昨天突然有一个做技术的朋友问我如何做插件。虽然我已经太久不做技术,但为了维持我在朋友面前样样精通的光辉形象,我还是忍不住好奇地查了点资料。感觉有一个写的还可以,转过来,供后来者研究。--看看
 
 
读了 goldboar的平台+插件软件设计思想及基于COM的原型实现,再加上自己的软件的需求,感觉很有必要将自己的软件设计成插件更新的方式。

平台+插件软件设计基本思想
  插件的本质在于不修改程序主体(平台)的情况下对软件功能进行扩展与加强,当插件的接口公开后,任何公司或个人都可以制作自己的插件来解决一些操作上的不便或增加新的功能,也就是实现真正意义上的“即插即用”软件开发。平台+插件软件结构是将一个待开发的目标软件分为两部分,一部分为程序的主体或主框架,可定义为平台,另一部分为功能扩展或补充模块,可定义为插件。
  在进行软件开发之前,是否采用平台+插件结构进行软件开发,还要依据具体的软件需求情况进行确定,但一般来讲,使用平台+插件结构进行软件设计会给所开发软件增加新的生命力。当确定平台+插件的软件结构之后,就要分析哪些部分功能由主体完成,即平台的基本功能,哪些部分功能由插件完成,即需要扩展的插件功能。平台所完成的功能应为一个软件系统的核心和基础,这些基本功能即可为用户使用,也可为插件使用,就是又可以把平台基本功能分为两个部分,内核功能和插件处理功能。平台的内核功能是整个软件的重要功能,一个软件的大部分功能因由内核功能完成。平台的插件处理功能用于扩展平台和管理插件,为插件操纵平台和与插件通信提供标准平台扩展接口。插件所完成的功能是对平台功能的扩展与补充,一般插件完成系列化功能,例如:PHOTOSHOP的滤镜插件完成对图形的特殊效果处理,这些功能都有一些共性,可以进行集中管理,并且是可以定义出标准的插件接口。
  为了实现平台+插件结构的软件设计需要定义两个标准接口,一个为由平台所实现的平台扩展接口,一个为插件所实现的插件接口。这里需要说明的是:平台扩展接口完全由平台实现,插件只是调用和使用,插件接口完全由插件实现,平台也只是调用和使用。平台扩展接口实现插件向平台方向的单向通信,插件通过平台扩展接口可获取主框架的各种资源和数据,可包括各种系统句柄,程序内部数据以及内存分配等。插件接口为平台向插件方向的单向通信,平台通过插件接口调用插件所实现的功能,读取插件处理数据等。
  平台插件处理功能包括插件注册、管理和调用,以及平台扩展接口的功能实现。插件注册为按照某种机制首先在系统中搜索已安装插件,之后将搜索到的插件注册到平台上,并在平台上生成相应的调用机制,这包括菜单选项、工具栏、内部调用等。插件管理完成插件与平台的协调,为各插件在平台上生成管理信息以及进行插件的状态跟踪。插件调用为调用各插件所实现的功能。平台插件处理功能实现的另一部分功能为平台扩展接口的具体实现。
  平台+插件软件设计步骤包括:
1、 确定平台基本功能和插件要完成系列化功能或扩展功能;
2、 定义平台扩展接口和插件接口;
3、 完成平台设计,主要是平台插件处理功能;
4、 向插件开发者提供主平台程序(执行代码),公布平台扩展接口和插件要实现的接口,可能包括开发用的SDK;
5、 插件开发者按要求开发插件,实现插件接口,开发者可使用提供的主平台程序测试插件;
6、 主平台设计者继续完成主平台的内核功能,并可随时公布新增加主平台扩展接口和插件接口;
7、 实现4-6步骤的良性循环,整个软件系统不断向前进化。
  平台+插件软件设计的优点:
1、 实现真正意义上的软件组件的“即插即用”;
2、 在二进制级上集成软件,减少大量的软件重新编译与发布麻烦与时间;
3、 能够很好实现软件模块的分工开发,能够大量吸取他人的优长;
4、 可较好实现代码隐藏,保护知识产权。
三、基于COM的原型实现
  平台+插件软件的目标及设计思路已经明确,那么用什么样的方法和技术实现插件(程序插件),从目前已有这方面软件的设计方法来看(Windows系统上的软件),一种是使用传统DLL方法的实现,一种是使用COM方法的实现。下面就以COM技术为基础,实现一个基本的原型框架设计。COM技术的原理大家都已经相当熟悉,本文为了实现平台+插件的几方面功能,相应地采用COM的相关方面技术与方法来介绍有关实现要点。整个原型系统开发环境:Windows 2000、Visual C++ 7.0,使用的开发库包括MFC和ATL。
  插件注册   为了管理插件首先是设计一种插件的注册机制,通过此种机制平台可以搜索到系统中所有的可用插件,并在平台上生成各插件的调用点。注册就需要为每插件设置一个特殊标识,有了这个标识的插件,平台就可以使用。使用COM实现注册机制有一种非常好的方法,这就是组件目录(Component Category)。组件目录也是COM实现的标准接口(Interface,不同于平台+插件中所说的接口)。在设计COM组件时,只为其定义一个目录分类信息即可,之后就可使用标准的组件目录接口在系统中搜索特定类型的组件,插件注册与标识就可轻松地解决了。
  插件管理与调用 由组件目录获得特定标识的组件后,就需要为每个插件生成管理机制,每个插件都有一个类ID(CLSID),在平台中为每个插件生成一个类ID数组,每个插件的每一个可调用功能均生成一个菜单项(动态生成菜单项)。对每个插件是否激活,平台都有相应的记录信息。插件调用可通过菜单消息循环或内部调用实现。
  平台扩展接口和插件接口 这两个接口不同于COM技术中的接口,但平台扩展接口和插件接口可使用COM技术的接口定义实现。在原型系统的实现上平台扩展接口定义了一个IServer接口,插件接口定义了一个IPlugin接口。IServer接口用于为插件传递内部数据接口,IPlugin接口用于读取插件功能信息,并且还用于传递平台消息与资源句柄。
  消息、资源与数据传递 平台与插件之间需要进行大量的消息与数据交互,其中包括:各种Windows消息、各种Windows资源句柄,以及系统使用的各种内部数据,有时还可能需要分配内存。所有的消息与数据交互均由平台扩展接口和插件接口所定义的标准方法实现,在原型系统中已经实现了鼠标消息、窗口句柄、设备句柄和程序内部定义数据结构的传递。

  结   论:原型系统已实现一种通用的平台+插件软件开发的框架模式,通过实践证明这种思路和设计方法可行,可以应用到我们的具体软件开发上。通过这种方式可以很好地解决软件合作开发与集成问题,对有版本级别的软件开发更为有用。高级版的软件安装有高级版的插件,低级版的软件不安装高级版的插件,这就给程序分发和开发带来极大的便利。对于有系列化功能的软件,系列化功能由插件实现。
  备注:若需要源代码资料请与作者联系。(2003年9月23日)


插件编写,说起来容易,其实就是程序主体中定义好基类接口,在插件中用派生类实现这些接口,然后定义基类的指针,指向接口所在的具体类的对象,调用相关接口函数就好了。
但作为一个工程,势必会有较多的插件产生,如何管理这些插件,我就不清楚了。然后在qt平台下,插件如何编写,如何管理,如何设计,还望各位指教。




下面是一些windows平台下的插件编写文章。
由云台协议DLL浅谈插件程序的编写
[url]http://blog.csdn.net/waterpub/archive/2004/12/25/228920.aspx[/url]
[url]http://blog.csdn.net/waterpub/archive/2004/12/25/228925.aspx[/url]

C++资源之不完全导引
[url]http://blog.csdn.net/waterpub/archive/2004/12/21/224013.aspx[/url]

另一种 WinDbg 插件编写方法 - Debugger Engine Extension
[url]http://blog.csdn.net/flier_lu/archive/2004/07/07/36428.aspx[/url]

思考插件架构体系
[url]http://kb.csdn.net/java/articles/200511/76e93daf-5d8b-43b4-aea2-e35a041149bf.html[/url]

VC++开发BHO插件(引用)
[url]http://blog.csdn.net/civet148/archive/2005/10/19/508895.aspx[/url]

在C#程序中实现插件架构 - Sunmast翻译
[url]http://blog.csdn.net/vieri_ch/archive/2005/10/13/502441.aspx[/url]

C#插件构架实战
[url]http://blog.csdn.net/ycl111/archive/2005/10/08/497313.aspx[/url]

学习插件技术原理后的一点认识
[url]http://blog.csdn.net/stella_tangxing/archive/2005/04/28/366850.aspx[/url]

给程序添加插件
[url]http://blog.csdn.net/hellotianma/archive/2005/05/28/382686.aspx[/url]

DLL插件(转)
[url]http://blog.csdn.net/lionhearter/archive/2004/12/28/232299.aspx[/url]

插件系统的设计(转贴)
[url]http://blog.csdn.net/chenlq/archive/2004/12/27/230433.aspx[/url]

做虚假的插件
[url]http://blog.csdn.net/ghj1976/archive/2004/11/24/193631.aspx[/url]

功能插件
[url]http://blog.csdn.net/gzzzz/archive/2004/08/21/81187.aspx[/url]

平台+插件软件设计思想及基于COM的原型实现
[url]http://blog.csdn.net/goldboar/archive/2003/09/28/21595.aspx[/url]

深入浅出Dll(介绍函数导出、类导出、钓子dll、不同语言混合编程方法、插件等的实现方法) 选择自 iceezone 的 Blog
[url]http://blog.csdn.net/yesnoor/archive/2005/10/20/510037.aspx[/url]

DLL插件
[url]http://blog.csdn.net/martinwang/archive/2005/08/18/457778.aspx[/url]
 
---------------------------------------------------------------------------------