一种组件间调用方法

文档序号:6650060阅读:162来源:国知局

专利名称::一种组件间调用方法
技术领域
:本发明涉及一种程序执行方法,尤其是一种程序执行过程种组件间的调用方法。
背景技术
:应用程序可执行的文件(Executableprogram),是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。它符合操作系统指定的某种格式,并以二进制的形式被存储,操作系统负责对程序的加载和运行。早期的程序设计没有组件的思想,所有功能都集中在一个可执行文件中。现今,应用程序通常以功能为标准被划分为多个相对独立的组件进行编写。每个组件相对独立,组件间通过接口实现相互的调用。当一个功能需求发生变化时,在保持接口不变的前提下,修改发生变化的功能组件,可使其它组件的代码保持不变。每个组件编写完成后,应用程序可以在需要组件的功能时动态的链接到组件,调用组件的接口。从而减少应用程序的大小和启动时间;同时,这个组件也可以同时被多个应用程序使用。为了减少软件开发的复杂性,提高组件的重用性,现有的操作系统都提供了组件的构建标准,在Windows下我们称基于该标准的组件为动态链接库(DLL,DynamicLinkLibrary);在Linux下称为共享对象文件(SoSharedObjectFile)等。以windows操作系统下的动态链接库为例组件C编写完成后,可编译成一个DLL。在运行时,只有当EXE程序要调用这些DLL组件时,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL组件可以同时被多个应用程序使用。同时,为了在Windows平台形成一种统一的组件开发和调用规范,实现组件间的通信以及组件间的调用,微软提出组件对象模型(COM,ComponentObjectModel)的方法,但由于其调用机制使得在组件与组件、客户与组件之间的调用实现之前需要编写大量的代码,实现复杂;并且,由于COM组件必须在注册表中注册以获取组件ID,在调用时通过查找注册表加载组件,然而,只有Windows平台存在注册表,因而基于COM开发的组件不能进行跨操作系统的移植。
发明内容本发明的目的是提供一种组件间调用的方法,该方法能够不依赖注册表,并且实现简单。为解决上述技术问题,本发明的目的是通过以下技术方案实现的1)为每个组件建立确定的标识和用于创建组件的函数,以及建立组件接口;2)程序加载到预置的共享内存,并触发将组件标识以及所述函数保存到共享内存;3)客户组件请求调用目标组件,系统查找目标组件标识以调用所述函数创建组件,返回目标组件接口,客户组件根据所述接口实现功能调用。在上述方法基础上,1)中还包括将多个所述的组件进行编译,构成组件集。上述方法中,3)中系统调用所述函数后,返回组件的接口指针,客户组件根据共享内存中的接口指针获取目标组件的接口。2)中程序加载到内存后,系统根据主程序的配置文件中预置的组件地址,读取确定目录下的组件,将组件接口集加入特定的共享内存;系统根据组件构造函数中预置的代码,进行保存组件标识及所述函数的操作。以上技术方案可以看出,本发明中程序加载到内存时将组件的信息保存到内存中,使得本发明的实现不需要依赖操作系统的特殊设置,例如采用本发明的方法实现组件间的调用时不依靠Windows系统中特有的注册表,因此本发明的组件间的调用不依赖于特定的操作系统,使得本发明的方法是可以跨操作平台实现。并且,在实际程序开发中采用本发明的方法时发现,与现有的依靠特定系统实现组件调用的方法相比,本发明组件间的调用相对简单,不需要大量的编码工作,从而提高了软件的开发效率。本发明利用了系统提供的共享内存,通过在共享内存中管理和维护特定的组件信息结构,从而使得各组件在所述共享内存中进行相互访问,使得组件间的调用更加方便简单。进一步,本发明中可以把多个组件编译成一个组件,实践证明,本发明中把多个组件编译成一个组件,在读取组件的过程中,减少了对磁盘的输入输出操作,提高了组件加载和执行效率。并且,实践中发现,由于每个组件都会被自动注册在内存中,因而,在这种方法下将多个组件编译为一个组件,给软件开发提供了调试和发布的灵活性。图1为本发明较佳实施例流程图;图2为本发明组件调用过程示意图。具体实施例方式本发明涉及一种组件间调用的方法。其核心在于每当可执行程序被加载到内存后,自动把指定目录下的所有组件信息(组件ID和创建该组件的函数指针)加载到可执行程序创建的一块共享内存中,调用某一个组件时,根据内存中组件所保存的信息,创建组件对象,从而实现组件功能调用。以下说明本发明的一较佳实施例,该实施例的原理为当一个进程开始时,执行体DLL或EXE被加载到内存,利用C++编程语言的全局对象的构造函数先于C运行库(C-RuntimeLibrary)执行的原理,在某个全局对象的构造函数中把组件内的信息组(组件ID,组件的创建体)存储在操作系统中进程的一块内存上,使得进程的任何组件和客户程序都能获取到这些信息组并根据信息组中的创建体创建组件对象。当调用一个组件时,通过组件ID查找在内存中保存的用于创建组件的函数,再通过对该函数的调用创建组件。组件被创建后,可以调用组件的接口来实现特定的组件功能。参照图1,本发明较佳实施例的实现方法如下。步骤11为每个组件赋予确定的标识ID和用于创建该组件的函数,以及建立组件接口;建立共享内存。所述组件,亦称为模块,其特征包括是封装性,组件必须向外部隐藏其内部的实现细节,使从外部所能看到的只是接口;组件必须能动态链接到一起,被调用的时候不必重新编译。本发明中为每个组件赋予一个唯一的标识和用于创建该组件的函数。与上文所述现有技术的COM方法相比,本发明为每个组件预置唯一的标识,而并非如COM组件一样,其ID通过在注册表中注册后获取。由于组件向外部隐藏了其内部的细节,因此客户要使用组件时就必须通过一定的机制,即通过一定的方法实现客户与组件之间的通信,这就需要接口。所谓接口就是组件对外的、向外部客户提供服务的“连接点”。外部的客户见不到组件内部的细节,它所能看到的只是接口,客户也是通过接口来获取组件提供的服务,通常,组件的开发人员负责实现这个接口,而客户则通过接口获得服务。本文所述的客户是指要使用某一个组件的程序或组件,也就是说,本文的客户是相对组件来说的。本发明中为每个组件提供一个接口,用于其他组件的函数调用。通过应用程序接口(API)应用程序建立一块共享内存,用于本发明中对组件信息的管理以及调用。所述共享内存的建立为本领域公知技术。步骤12对每个组件进行编译,并保存到指定的目录;根据需要也可以将多个组件编译成一个组件集,亦即将多个组件编译为一个DLL或一个EXE。具体的,将每个组件进行编译,并保存到指定的目录下,在主程序的配置文件中标识组件保存的地址信息,使得系统执行到所述配置文件时可到正确的目录下读取程序运行所需的所有组件。步骤13某个组件加载到内存时,触发将组件标识以及所述函数保存到内存。如上文所述,本实施例中利用C++编程语言的全局对象的构造函数先于C运行库(C-RuntimeLibrary)执行的原理,在某个全局对象的构造函数中把组件内的信息组(组件ID,组件的创建函数)存储在操作系统中进程的一块内存上。每个组件都会提供一个入口地址,即告知系统读取该组件后所应执行的代码,所述入口地址一般指向编译器设定的地址。C++编译器会自动设定这个地址,从而在这个地址上调用全局对象的构造函数。当组件被加载到内存后,依据组件提供的入口地址,系统会自动去执行构造函数,本发明在组件的构造函数中编写代码,用于在共享内存中保存组件信息。当进程开始时,系统根据所述主程序中的配置文件到正确的目录下读取组件,进而系统执行所述构造函数将组件的唯一标识以及用于创建组件的函数加载到内存中。加载指定目录下的组件信息时,每加载一个组件的信息,就要有一次遍历该目录的操作,进行一次输入输出操作,浪费系统资源。因而,上述步骤12中将多个组件编译成一个组件(组件集),进而加载组件时减少了输入输出操作,提高了效率。在多个组件编译为一个组件集后,在加载该组件集信息到内存的过程中,由于,每个组件代码里都有一个不同的全局对象(通过C++宏的使用实现),该个组件集内的每个组件的信息是独立保存的。步骤14发生组件调用,在内存中查找目标组件标识以调用函数创建组件,返回目标组件的实例。通过这个实例可以调用组件的各个功能接口,据所述接口实现功能调用。组件间进行调用时,通过共享内存中保存的组件信息,获取创建被调用组件(目标组件)的函数指针,组件被创建后,返回组件接口指针,客户通过所述组件接口指针获取目标组件的接口,进而实现组件间的功能调用。现有技术中,应用程序执行后,被加载到内存,当应用程序要调用组件时,组件信息会被写到内存中。假设应用程序需要调用3个组件,分别是dll1、dll2、dll3,程序会为这三个组件创建一个内存空间,供其写入信息。然而这三个内存空间都是独立的,互无关系,导致三个组件间进行访问时,实现繁琐。本发明中采用了共享内存的机制。本发明实施例中,应用程序首先通过系统提供的函数创建一块共享内存,当应用程序调用组件时,会为每个组件在这块共享内存中创建一块空间,每个组件可通过组件名称互相访问。通过组件名称进行访问是系统为共享内存提供的一种命名机制。通常,每个组件只能对自己的空间进行管理,其他组件及应用程序都无权对其管理。例如应用程序调用完dll1,需要释放dll1所在的这块空间,而应用程序无权做这项工作。这个缺陷导致组件空间管理上,很不灵活。本发明为每个组件建立了唯一的标识ID,通过传送组件ID,可以达到组件间进行内存空间管理的目的。参照图2,进一步说明组件调用过程的处理方法。如图所示,图中可执行程序EXE,由组件1、组件2、组件3、组件4、组件5组成。进程开始,当EXE被加载到内存,组件1到组件5分别被加载到应用程序建立的共享内存中,依据组件提供的入口地址,系统自动执行构造函数,保存每个组件的信息(唯一标识ID和用于创建该组件的函数)到共享内存中。组件信息保存后,被加载的组件可释放内存空间。然而,组件对内存空间的释放并非本发明所必不可少的操作。当发生组件调用,假设组件1调用组件3,根据组件3的唯一标识ID3,查找到用于创建组件3的函数CoCreate3(),创建组件3后,返回组件3的接口指针,组件1通过所述组件3接口的指针获取该接口,并通过该接口调用组件3的功能函数。以上对本发明所提供的一种组件间调用方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。权利要求1.一种组件间调用方法,其特征在于1)为每个组件建立确定的标识和用于创建组件的函数,以及建立组件接口;2)程序加载到预置的共享内存,并触发将组件标识以及所述函数保存到共享内存;3)客户组件请求调用目标组件,系统查找目标组件标识以调用所述函数创建组件,返回目标组件接口,客户组件根据所述接口实现功能调用。2.如权利要求1所述的组件间调用方法,其特征在于1)中还包括将多个所述的组件进行编译,构成组件集。3.如权利要求1所述的组件间调用方法,其特征在于3)中系统调用所述函数后,返回组件的接口指针,客户组件根据共享内存中的接口指针获取目标组件的接口。4.如权利要求1所述的组件间调用方法,其特征在于2)中系统根据组件构造函数中预置的代码,进行保存组件标识及所述函数的操作。5.如权利要求1或4所述的组件间调用方法,其特征在于2)中程序加载到内存后,系统根据主程序的配置文件中预置的组件地址,读取确定目录下的组件,将组件接口集加入特定的共享内存。全文摘要本发明涉及一种组件间调用方法,包括1)为每个组件建立确定的标识和用于创建组件的函数,以及建立组件接口;2)程序加载到预置的共享内存,并触发将组件标识以及所述函数保存到共享内存;3)客户组件请求调用目标组件,系统查找目标组件标识以调用所述函数创建组件,返回目标组件接口,客户组件根据所述接口实现功能调用。本发明的组件间的调用不依赖于特定的操作系统,使得本发明的方法可以跨操作平台实现。本发明组件间的调用相对简单,不需要大量的编码工作,从而提高了软件的开发效率。文档编号G06F9/46GK1834918SQ20051011549公开日2006年9月20日申请日期2005年11月4日优先权日2005年11月4日发明者孙华庆,周焱申请人:北京金山软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1