APP下载

软件插件技术及其应用研究

2007-08-25于珊珊

智能计算机与应用 2007年4期
关键词:调用宿主插件

于珊珊

摘要:讨论了插件技术的原理、插件的管理、插件的实现方案,在此基础上研究了插件技术在数据库开发过程中的应用。

关键词:插件接口数据库系统开发

1插件技术的原理

1.1动态链接库(Dynamic Link Li-brary)

它本身不能独立运行,但它能输出函数或类,通过其它能独立运行的程序(宿主程序)可以调用它内部的功能。动态链接库有两种调用方式:

(1)静态调用方式:由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码。

隐式的调用:需要把产生动态连接库时产生的,LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只须说明一下。隐式调用不需要调用LoadLibrary()和FreeIAbrary()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。

当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载到内存中。可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他函数一样。

(2)动态调用方式:由编程者用API函数加载和卸载DLL调用DLL,使用较复杂,但能更有效地使用内存,是编制大型应用程序的重要方式。

显式的调用:是指在应用程序中用I.oadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的MxFreeLi-brary释放动态连接库。直接调用Win32的LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序调用GetProcAddress函数时使用这一参数。C,etProcAddress函数将符号名或标识号转换为DLL内部的地址。程序员可决定DLL文件何时加载或不加载,显式链接在运行时决定加载哪个DLL文件。使用DLL的程序在使用之前必加载(LoadLibrary)DLL,得到一个DLL模块的句柄,然后调用GetPro-cAddress函数得到输出函数指针,在退出之前必卸载(FreeLibrary)DLL。

1.2接口。宿主程序与插件只能通过制订好的接口进行通信。软件开发中,接口只是定义功能并规定调用功能的形式,而不包含功能的实现。接口实质上是软件模块的调用规范。就开发支持插件功能的应用程序而言,一般来说由宿主程序的开发者来制订接口,如果希望其他的开发人员能开发相关的插件,只要公开相关的接口即可。接口功能一般由插件方实现。因为插件的实现也许要调用宿主程序的功能,所以接口功能也可能由宿主程序来实现。也就是说,宿主程序与插件的信息流可能是双向的。接口的调用规范与功能实现相互分离有一个很大的优点:尽管不同的插件开发者对同一个接口的具体实现不同,但是在宿主程序中对这些插件的调用方式是一样的。如果有宿主程序实现的接口,在不同的插件中也可以用相同的使用方式调用宿主程序的功能。这极大地提高了应用程序的灵活性。

1.3开发支持插件功能应用程序的解决方案。(在动态链接库中实现插件接口,在宿主程序中运用显式链接方式动态加载插件。支持插件功能的应用程序的结构如图1所示。在宿主程序中,插件管理部分用于管理插件的安装和删除,并将所安装插件的信息保存到适合的地方,例如保存到注册表或配置文件中。宿主程序启动时,根据插件的配置信息加载插件模块,然后获得插件的输出函数或输出类的指针并加以保存,如果需要的话,可以向宿主程序增加界面接口元素,如菜单、工具条按钮等。在宿主程序中当点击与插件相关联的接口元素(如菜单等)时,就会触发插件调用函数,在插件调用函数中使用宿主程序中所保存的插件信息调用插件中实现的功能。在调用插件输出函数时也可以把宿主程序中实现的接口传递给插件方。

2插件管理

主程序必须为支持插件提供插件管理功能,它调用了插件提供的接口,其具体实现实际上是由插件本身完成的。插件管理主要提供以下几个方面的功能:(1)注册、反注册插件。(2)启用、禁用插件。(3)显示插件基本信息。(4)配置插件参数。

3插件的实现方案

对于插件的实现,有动态链接库(DLL)、COM组件两种方案,目前的系统中,采用动态链接库(DLL)方案。(1)DLL是在Windows系统中实现软件组件重要的方法,在动态链接库(DLL)中,集中实现插件,只需用户有在Windows下编写一般DLL的经历,再花少量的时间熟练有关插件的调用规则及编程规则,就可进行插件设计与开发;(2)COM,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。COM既提供了组件之间进行交互的规范,也提供了实现交互的环境,由于同类插件一般有统一的调用接口,因此也可使用COM技术作为开发插件的基础。COM接口是COM对象与系统之间的交互通道,而调用插件的函数在同类插件间是基本相同的,因而,可把插件的初始化及调用插件的交互通道定义为插件的接口,则编写插件也就是编写COM插件的过程,同时,也有利于多个插件实现在一个COM组件中,并应用组件的聚合等专有技术实现功能更强的插件。使用COM技术作为编写插件的技术,更易于在插件与系统间进行交互操作,对编写插件及扩大插件的使用范围是很有利的;但与之相应的是,应用COM技术编写插件时,涉及大量的COM技术及原理,导致开发者难以迅速地应用该项技术编写插件来解决实际问题。

4插件技术在数据库开发中的应用

由于系统设计上已经使用插件技术,将每项功能都单独设计,使得系统在开发过程中变得更加可视,可控,易控,用插件技术设计数据库系统并不是简单的将数据库系统划分模块,它已经将每项功能都划分成了单独设计体,因此,在每项功能的开发过程中,都可以明确每一项功能的开发责任,可以明确每一项功能的结构,输入,输出,所需数据,处理方式等要素。它将模块更加细化,并切断了模块当中每一项功能之间的联系,减少了制约因素。这就使开发进度表由模块级划分变成由功能级划分,由模块进度线变成功能进度线,从而扩大了单位时间的开发量,变纵向式开发为横向式开发。在功能开发完毕。进行调试过程当中,由于开发使用了插件技术,使得调试工作更加简单,调试内容变得更少,更有利于进行白盒测试,保证了软件的质量。

猜你喜欢

调用宿主插件
用好插件浏览器标签页管理更轻松
穿山甲和新型冠状病毒到底啥关系
鸟界“神偷”——大杜鹃公审案
请个浏览器插件全能管家
基于Android Broadcast的短信安全监听系统的设计和实现
基于jQUerY的自定义插件开发
抓住自然宿主
绦虫大战,争夺宿主控制权
利用RFC技术实现SAP系统接口通信
美国社交网站的周末大战