论文部分内容阅读
摘 要:本文介绍了插件技术的原理,阐释了插件的实现方案,提出了插件技术在地震处理插件系统中的应用。
关键词:插件;接口;插件技术
【中图分类号】TP31
1引言
一个可以挂接插件的软件系统,通常包括主程序(host)和插件(p1ug-in)组两个部分。插件可以由动态链接库实现,主程序根据接口规则,调用插件的功能,同时还可将任意插件接口在内存中的地址传递给每个插件,插件则根据这些地址來调用其他插件函数,完成所需功能、获取所需资源等。
2插件技术的原理
2.1动态链接库
动态链接库(Dynamic Link Library)是一种具有一定功能的可执行软件模块,虽然它本身不能独立运行,但是它可以输出函数或类,通过其他能独立运行的程序(宿主程序)可以调用它内部的功能。动态链接库有两种调用方式:
2.1.1静态调用方式
由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(如还有其他程序使用该DLL,则Windows对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它),简单实用,但不够灵活,只能满足一般要求。隐式的调用需要把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只需说明一下。隐式调用不需要调用Load Library()和Free Library()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。
2.1.2动态调用方式
是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
显式的调用是指在应用程序中用Load Library或MFC提供的Afx Load Library显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用Get ProcAddress()获取想要引入的函数。自此,就可以使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用Free Library或MFC提供的Afx Free Library释放动态连接库。直接调用Win32的Load Library函数,并指定DLL的路径作为参数。Load Library返回HINSTANCE参数,应用程序在调用Get Proc Address函数时使用这一参数。GetProc Address函数将符号名或标识号转换为DLL内部的地址。
2.2接口
开发支持插件功能的应用程序必须解决一个问题:如何在宿主程序与插件间正确地相互通信。为了在宿主程序与插件间能正确地相互通信,应该先制订一套通信标准,这套制订好的通信标准就是接口,宿主程序与插件只能通过制订好的接口进行通信。软件开发中,接口只是定义功能并规定调用功能的形式,而不包含功能的实现。接口实质上是软件模块的调用规范,就开发支持插件功能的应用程序而言,一般来说由宿主程序的开发者来制订接口,如果希望其他的开发人员能开发相关的插件,只要公开相关的接口即可。接口功能一般由插件方实现。
2.3程序结构及运行机制
可以得出一个开发支持插件功能应用程序的解决方案:在动态链接库中实现插件接口,在宿主程序中运用显式链接方式动态加载插件。在宿主程序中,插件管理部分用于管理插件的安装和删除,并将所安装插件的信息保存到适合的地方,例如保存到注册表或配置文件中。宿主程序启动时,根据插件的配置信息加载插件模块,然后获得插件的输出函数或输出类的指针并加以保存,如果需要的话,可以向宿主程序增加界面接口元素,如菜单、工具条按钮等。在宿主程序中当点击与插件相关联的接口元素(如菜单等)时,就会触发插件调用函数,在插件调用函数中使用宿主程序中所保存的插件信息调用插件中实现的功能。在调用插件输出函数时也可以把宿主程序中实现的接口传递给插件方。
3实现方案
对于插件的实现,有动态链接库(DLL)、COM组件两种方案,在目前的系统中,采用动态链接库(DLL)方案。DLL,亦是在Windows系统中实现软件组件重用的方法,在动态链接库(DLL)中,集中实现插件,只需用户有在Windows下编写一般DLL的经历,再花少量的时间熟练有关插件的调用规则及编程规则,就可进行插件设计与开发。COM,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。COM既提供了组件之间进行交互的规范,也提供了实现交互的环境,由于同类插件一般有统一的调用接口,因此也可使用COM技术作为开发插件的基础。COM接口是COM对象与系统之间的交互通道,而调用插件的函数在同类插件间是基本相同的,因而,可把插件的初始化及调用插件的交互通道定义为插件的接口,则编写插件也就是编写COM插件的过程,同时,也有利于多个插件实现在一个COM组件中,并应用组件的聚合等专有技术实现功能更强的插件。使用COM技术作为编写插件的技术,更易于在插件与系统间进行交互操作,这对编写插件及扩大插件的使用范围是很有利的。但与之相应的是,应用COM技术编写插件时,涉及大量的COM技术及原理,导致开发者难以迅速地应用该项技术编写插件来解决实际问题。
4应用
4.1基本需求
地震处理系统主要包括数据的输入、输出和数据处理3个部分。数据输入包括识别各种格式的地震数据,并将数据加载进内存;数据输出包括屏幕输出、绘图和文件保存。在数据处理中,处理功能由插件完成,其中最重要的部分是数据流在整个程序中的流动,主程序需要将插件所需要处理的数据和相关信息,通过接口传递给插件;而插件也将处理后的数据和相关信息,通过接口反馈给插件。每个地震处理功能模块能够独自完成一种或多种处理工作。地震处理还需要能够完成批处理的功能,即组织多个地震处理功能模块,一次性地完成某个处理任务。
4.2基本思想
根据插件实现的机制,把地震处理系统分成两部分。第一部分是主程序,负责管理和加载地震处理功能模块,建立处理流程和组织处理流程;第二部分是处理功能模块,全部设计成插件,并由动态链接库实现。因此,主程序中的地震处理功能模块管理和加载,实际上就是插件的管理和加载。为了方便主程序和处理模块(插件)之间、处理模块(插件)和处理模块(插件)之间的通信,以及数据传输,需要制定通信和数据传输的规则和协议,统称为接口。
另外,主程序应该记录程序(包括插件)运行过程中产生的信息、错误、错误处理,并将其写到日志文件中,以备用户查询。主程序还应该响应帮助事件,提供帮助信息和提示信息的显示。
4.3接口设计
插件系统主程序和插件之间需要传递数据和信息,所以需要设计一数据结构,能够将所有插件所需要的数据和信息包含进来。数据结构要针对地震数据文件格式设计,用以传递插件模块所需要的参数、数据存储地址和其他信息。接口中应含有数据主要的道头信息、输入文件地址、数据内存地址、画图函数地址,以及其他插件的内存地址。具体实现请参照下一节的地震数据处理插件系统的数据结构部分。
参考文献
[1]陈方明,陈奇.基于插件思想的可重用软件设计与实现[J].计算机工程与设计者,2005,(26):172-173.
[2]刘兴平,等.插件技术研究初探[J].延安大学学报(自然科学版)2006,25(1).
关键词:插件;接口;插件技术
【中图分类号】TP31
1引言
一个可以挂接插件的软件系统,通常包括主程序(host)和插件(p1ug-in)组两个部分。插件可以由动态链接库实现,主程序根据接口规则,调用插件的功能,同时还可将任意插件接口在内存中的地址传递给每个插件,插件则根据这些地址來调用其他插件函数,完成所需功能、获取所需资源等。
2插件技术的原理
2.1动态链接库
动态链接库(Dynamic Link Library)是一种具有一定功能的可执行软件模块,虽然它本身不能独立运行,但是它可以输出函数或类,通过其他能独立运行的程序(宿主程序)可以调用它内部的功能。动态链接库有两种调用方式:
2.1.1静态调用方式
由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(如还有其他程序使用该DLL,则Windows对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它),简单实用,但不够灵活,只能满足一般要求。隐式的调用需要把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只需说明一下。隐式调用不需要调用Load Library()和Free Library()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。
2.1.2动态调用方式
是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
显式的调用是指在应用程序中用Load Library或MFC提供的Afx Load Library显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用Get ProcAddress()获取想要引入的函数。自此,就可以使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用Free Library或MFC提供的Afx Free Library释放动态连接库。直接调用Win32的Load Library函数,并指定DLL的路径作为参数。Load Library返回HINSTANCE参数,应用程序在调用Get Proc Address函数时使用这一参数。GetProc Address函数将符号名或标识号转换为DLL内部的地址。
2.2接口
开发支持插件功能的应用程序必须解决一个问题:如何在宿主程序与插件间正确地相互通信。为了在宿主程序与插件间能正确地相互通信,应该先制订一套通信标准,这套制订好的通信标准就是接口,宿主程序与插件只能通过制订好的接口进行通信。软件开发中,接口只是定义功能并规定调用功能的形式,而不包含功能的实现。接口实质上是软件模块的调用规范,就开发支持插件功能的应用程序而言,一般来说由宿主程序的开发者来制订接口,如果希望其他的开发人员能开发相关的插件,只要公开相关的接口即可。接口功能一般由插件方实现。
2.3程序结构及运行机制
可以得出一个开发支持插件功能应用程序的解决方案:在动态链接库中实现插件接口,在宿主程序中运用显式链接方式动态加载插件。在宿主程序中,插件管理部分用于管理插件的安装和删除,并将所安装插件的信息保存到适合的地方,例如保存到注册表或配置文件中。宿主程序启动时,根据插件的配置信息加载插件模块,然后获得插件的输出函数或输出类的指针并加以保存,如果需要的话,可以向宿主程序增加界面接口元素,如菜单、工具条按钮等。在宿主程序中当点击与插件相关联的接口元素(如菜单等)时,就会触发插件调用函数,在插件调用函数中使用宿主程序中所保存的插件信息调用插件中实现的功能。在调用插件输出函数时也可以把宿主程序中实现的接口传递给插件方。
3实现方案
对于插件的实现,有动态链接库(DLL)、COM组件两种方案,在目前的系统中,采用动态链接库(DLL)方案。DLL,亦是在Windows系统中实现软件组件重用的方法,在动态链接库(DLL)中,集中实现插件,只需用户有在Windows下编写一般DLL的经历,再花少量的时间熟练有关插件的调用规则及编程规则,就可进行插件设计与开发。COM,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。COM既提供了组件之间进行交互的规范,也提供了实现交互的环境,由于同类插件一般有统一的调用接口,因此也可使用COM技术作为开发插件的基础。COM接口是COM对象与系统之间的交互通道,而调用插件的函数在同类插件间是基本相同的,因而,可把插件的初始化及调用插件的交互通道定义为插件的接口,则编写插件也就是编写COM插件的过程,同时,也有利于多个插件实现在一个COM组件中,并应用组件的聚合等专有技术实现功能更强的插件。使用COM技术作为编写插件的技术,更易于在插件与系统间进行交互操作,这对编写插件及扩大插件的使用范围是很有利的。但与之相应的是,应用COM技术编写插件时,涉及大量的COM技术及原理,导致开发者难以迅速地应用该项技术编写插件来解决实际问题。
4应用
4.1基本需求
地震处理系统主要包括数据的输入、输出和数据处理3个部分。数据输入包括识别各种格式的地震数据,并将数据加载进内存;数据输出包括屏幕输出、绘图和文件保存。在数据处理中,处理功能由插件完成,其中最重要的部分是数据流在整个程序中的流动,主程序需要将插件所需要处理的数据和相关信息,通过接口传递给插件;而插件也将处理后的数据和相关信息,通过接口反馈给插件。每个地震处理功能模块能够独自完成一种或多种处理工作。地震处理还需要能够完成批处理的功能,即组织多个地震处理功能模块,一次性地完成某个处理任务。
4.2基本思想
根据插件实现的机制,把地震处理系统分成两部分。第一部分是主程序,负责管理和加载地震处理功能模块,建立处理流程和组织处理流程;第二部分是处理功能模块,全部设计成插件,并由动态链接库实现。因此,主程序中的地震处理功能模块管理和加载,实际上就是插件的管理和加载。为了方便主程序和处理模块(插件)之间、处理模块(插件)和处理模块(插件)之间的通信,以及数据传输,需要制定通信和数据传输的规则和协议,统称为接口。
另外,主程序应该记录程序(包括插件)运行过程中产生的信息、错误、错误处理,并将其写到日志文件中,以备用户查询。主程序还应该响应帮助事件,提供帮助信息和提示信息的显示。
4.3接口设计
插件系统主程序和插件之间需要传递数据和信息,所以需要设计一数据结构,能够将所有插件所需要的数据和信息包含进来。数据结构要针对地震数据文件格式设计,用以传递插件模块所需要的参数、数据存储地址和其他信息。接口中应含有数据主要的道头信息、输入文件地址、数据内存地址、画图函数地址,以及其他插件的内存地址。具体实现请参照下一节的地震数据处理插件系统的数据结构部分。
参考文献
[1]陈方明,陈奇.基于插件思想的可重用软件设计与实现[J].计算机工程与设计者,2005,(26):172-173.
[2]刘兴平,等.插件技术研究初探[J].延安大学学报(自然科学版)2006,25(1).