1.1、插件的运行机制
应用软件提供使插件能够应用的各项服务,其中包括提供加载方式,使插件可以加载到应用程序和网络传输协议中,从而和插件进行数据交换。插件必须依赖于应用程序才能发挥自身功能,仅靠插件是无法正常运行的。相反地,应用程序并不需要依赖插件就可以运行,这样一来,插件就可以加载到应用程序上并且动态更新而不会对应用程序造成任何改变。
插件定位于开发实现应用软件平台不具备的功能的程序,与主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护。
简单理解就是:系统可以加载插件,但它不知道任何东西,通过一组定义良好的接口和协议与它们进行通信。
1.2、插件和动态库的差别
两者都是用于封装部分功能的实现,并降低模块代码耦合度。但其实插件也是被部署为动态库的形式,但是和传统的动态库还是有一些差别的。
1.2.1、插件
插件主要面向接口编程,无需访问 .lib 文件,热插拔、利于团队开发。即使在程序运行时 .dll 不存在,也可以正常启动,只是相应插件的功能无法正常使用而已。
1.2.2、动态库
动态库需要访问 .lib 文件,而且在程序运行时必须保证 .dll 存在,否则无法正常启动。
1.3、插件的应用场景
一个大型项目的开发离不开插件化,可以让整个框架结构更加清晰和容易理解,比如说一个该项目经常会针对不同客户做功能定制,或者对于软件使用的不同场景,功能有所区别,那这时候插件就变得非常有用了,主工程中包含所有功能模块的调用,但是如果某些功能如果不需要,那最终程序打包只要不把插件的dll打包进去就OK了,程序依然可以正常运行,只是该插件的功能无法使用而已。
这样对于多功能模块的情况下,如果不同版本仅需要其中几项功能,就可以不用像动态链接库那样,全部dll都包含进去,从而也节省了安装包的空间。
2、QT中的插件
Qt提供了两种API用于创建插件:
(1)、一种是高阶API用于扩展Qt本身的功能:如自定义数据库驱动,图像格式,文本编码,自定义样式等等;
(2)、一种低阶API用于扩展Qt应用程序。
支持静态和动态两种方式来调用插件。
3、QT插件开发示例
QT的插件开发至少分为两部分:主程序部分和插件程序部分。其中主程序部分定义插件的接口并提供插件的管理器用于管理插件的加载与使用;插件程序部分用于按照主程序中定义的插件接口来定义插件,最终实现插件的功能,并生成供主程序部分调用的插件。