CN1834918A - 一种组件间调用方法 - Google Patents

一种组件间调用方法 Download PDF

Info

Publication number
CN1834918A
CN1834918A CN 200510115496 CN200510115496A CN1834918A CN 1834918 A CN1834918 A CN 1834918A CN 200510115496 CN200510115496 CN 200510115496 CN 200510115496 A CN200510115496 A CN 200510115496A CN 1834918 A CN1834918 A CN 1834918A
Authority
CN
China
Prior art keywords
assembly
component
interface
call
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 200510115496
Other languages
English (en)
Other versions
CN100487649C (zh
Inventor
孙华庆
周焱
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Kingsoft Office Software Inc
Original Assignee
Beijing Kingsoft Software Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Kingsoft Software Co Ltd filed Critical Beijing Kingsoft Software Co Ltd
Priority to CN 200510115496 priority Critical patent/CN100487649C/zh
Publication of CN1834918A publication Critical patent/CN1834918A/zh
Application granted granted Critical
Publication of CN100487649C publication Critical patent/CN100487649C/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明涉及一种组件间调用方法,包括:1)为每个组件建立确定的标识和用于创建组件的函数,以及建立组件接口;2)程序加载到预置的共享内存,并触发将组件标识以及所述函数保存到共享内存;3)客户组件请求调用目标组件,系统查找目标组件标识以调用所述函数创建组件,返回目标组件接口,客户组件根据所述接口实现功能调用。本发明的组件间的调用不依赖于特定的操作系统,使得本发明的方法可以跨操作平台实现。本发明组件间的调用相对简单,不需要大量的编码工作,从而提高了软件的开发效率。

Description

一种组件间调用方法
技术领域
本发明涉及一种程序执行方法,尤其是一种程序执行过程种组件间的调用方法。
背景技术
应用程序:可执行的文件(Executable program),是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。它符合操作系统指定的某种格式,并以二进制的形式被存储,操作系统负责对程序的加载和运行。
早期的程序设计没有组件的思想,所有功能都集中在一个可执行文件中。现今,应用程序通常以功能为标准被划分为多个相对独立的组件进行编写。每个组件相对独立,组件间通过接口实现相互的调用。当一个功能需求发生变化时,在保持接口不变的前提下,修改发生变化的功能组件,可使其它组件的代码保持不变。每个组件编写完成后,应用程序可以在需要组件的功能时动态的链接到组件,调用组件的接口。从而减少应用程序的大小和启动时间;同时,这个组件也可以同时被多个应用程序使用。
为了减少软件开发的复杂性,提高组件的重用性,现有的操作系统都提供了组件的构建标准,在Windows下我们称基于该标准的组件为动态链接库(DLL,Dynamic Link Library);在Linux下称为共享对象文件(So:Shared ObjectFile)等。
以windows操作系统下的动态链接库为例:组件C编写完成后,可编译成一个DLL。在运行时,只有当EXE程序要调用这些DLL组件时,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL组件可以同时被多个应用程序使用。同时,为了在Windows平台形成一种统一的组件开发和调用规范,实现组件间的通信以及组件间的调用,微软提出组件对象模型(COM,Component Object Model)的方法,但由于其调用机制使得在组件与组件、客户与组件之间的调用实现之前需要编写大量的代码,实现复杂;并且,由于COM组件必须在注册表中注册以获取组件ID,在调用时通过查找注册表加载组件,然而,只有Windows平台存在注册表,因而基于COM开发的组件不能进行跨操作系统的移植。
发明内容
本发明的目的是提供一种组件间调用的方法,该方法能够不依赖注册表,并且实现简单。
为解决上述技术问题,本发明的目的是通过以下技术方案实现的:1)为每个组件建立确定的标识和用于创建组件的函数,以及建立组件接口;2)程序加载到预置的共享内存,并触发将组件标识以及所述函数保存到共享内存;3)客户组件请求调用目标组件,系统查找目标组件标识以调用所述函数创建组件,返回目标组件接口,客户组件根据所述接口实现功能调用。
在上述方法基础上,1)中还包括将多个所述的组件进行编译,构成组件集。
上述方法中,3)中系统调用所述函数后,返回组件的接口指针,客户组件根据共享内存中的接口指针获取目标组件的接口。2)中程序加载到内存后,系统根据主程序的配置文件中预置的组件地址,读取确定目录下的组件,将组件接口集加入特定的共享内存;系统根据组件构造函数中预置的代码,进行保存组件标识及所述函数的操作。
以上技术方案可以看出,本发明中程序加载到内存时将组件的信息保存到内存中,使得本发明的实现不需要依赖操作系统的特殊设置,例如采用本发明的方法实现组件间的调用时不依靠Windows系统中特有的注册表,因此本发明的组件间的调用不依赖于特定的操作系统,使得本发明的方法是可以跨操作平台实现。并且,在实际程序开发中采用本发明的方法时发现,与现有的依靠特定系统实现组件调用的方法相比,本发明组件间的调用相对简单,不需要大量的编码工作,从而提高了软件的开发效率。
本发明利用了系统提供的共享内存,通过在共享内存中管理和维护特定的组件信息结构,从而使得各组件在所述共享内存中进行相互访问,使得组件间的调用更加方便简单。
进一步,本发明中可以把多个组件编译成一个组件,实践证明,本发明中把多个组件编译成一个组件,在读取组件的过程中,减少了对磁盘的输入输出操作,提高了组件加载和执行效率。并且,实践中发现,由于每个组件都会被自动注册在内存中,因而,在这种方法下将多个组件编译为一个组件,给软件开发提供了调试和发布的灵活性。
附图说明
图1为本发明较佳实施例流程图;
图2为本发明组件调用过程示意图。
具体实施方式
本发明涉及一种组件间调用的方法。其核心在于:每当可执行程序被加载到内存后,自动把指定目录下的所有组件信息(组件ID和创建该组件的函数指针)加载到可执行程序创建的一块共享内存中,调用某一个组件时,根据内存中组件所保存的信息,创建组件对象,从而实现组件功能调用。
以下说明本发明的一较佳实施例,该实施例的原理为:当一个进程开始时,执行体DLL或EXE被加载到内存,利用C++编程语言的全局对象的构造函数先于C运行库(C-Runtime Library)执行的原理,在某个全局对象的构造函数中把组件内的信息组(组件ID,组件的创建体)存储在操作系统中进程的一块内存上,使得进程的任何组件和客户程序都能获取到这些信息组并根据信息组中的创建体创建组件对象。当调用一个组件时,通过组件ID查找在内存中保存的用于创建组件的函数,再通过对该函数的调用创建组件。组件被创建后,可以调用组件的接口来实现特定的组件功能。
参照图1,本发明较佳实施例的实现方法如下。
步骤11:为每个组件赋予确定的标识ID和用于创建该组件的函数,以及建立组件接口;建立共享内存。
所述组件,亦称为模块,其特征包括:是封装性,组件必须向外部隐藏其内部的实现细节,使从外部所能看到的只是接口;组件必须能动态链接到一起,被调用的时候不必重新编译。本发明中为每个组件赋予一个唯一的标识和用于创建该组件的函数。与上文所述现有技术的COM方法相比,本发明为每个组件预置唯一的标识,而并非如COM组件一样,其ID通过在注册表中注册后获取。
由于组件向外部隐藏了其内部的细节,因此客户要使用组件时就必须通过一定的机制,即通过一定的方法实现客户与组件之间的通信,这就需要接口。所谓接口就是组件对外的、向外部客户提供服务的“连接点”。外部的客户见不到组件内部的细节,它所能看到的只是接口,客户也是通过接口来获取组件提供的服务,通常,组件的开发人员负责实现这个接口,而客户则通过接口获得服务。本文所述的客户是指要使用某一个组件的程序或组件,也就是说,本文的客户是相对组件来说的。本发明中为每个组件提供一个接口,用于其他组件的函数调用。
通过应用程序接口(API)应用程序建立一块共享内存,用于本发明中对组件信息的管理以及调用。所述共享内存的建立为本领域公知技术。
步骤12:对每个组件进行编译,并保存到指定的目录;根据需要也可以将多个组件编译成一个组件集,亦即将多个组件编译为一个DLL或一个EXE。
具体的,将每个组件进行编译,并保存到指定的目录下,在主程序的配置文件中标识组件保存的地址信息,使得系统执行到所述配置文件时可到正确的目录下读取程序运行所需的所有组件。
步骤13:某个组件加载到内存时,触发将组件标识以及所述函数保存到内存。
如上文所述,本实施例中利用C++编程语言的全局对象的构造函数先于C运行库(C-Runtime Library)执行的原理,在某个全局对象的构造函数中把组件内的信息组(组件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的功能函数。
以上对本发明所提供的一种组件间调用方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (5)

1、一种组件间调用方法,其特征在于:
1)为每个组件建立确定的标识和用于创建组件的函数,以及建立组件接口;
2)程序加载到预置的共享内存,并触发将组件标识以及所述函数保存到共享内存;
3)客户组件请求调用目标组件,系统查找目标组件标识以调用所述函数创建组件,返回目标组件接口,客户组件根据所述接口实现功能调用。
2、如权利要求1所述的组件间调用方法,其特征在于:
1)中还包括将多个所述的组件进行编译,构成组件集。
3、如权利要求1所述的组件间调用方法,其特征在于:
3)中系统调用所述函数后,返回组件的接口指针,客户组件根据共享内存中的接口指针获取目标组件的接口。
4、如权利要求1所述的组件间调用方法,其特征在于:
2)中系统根据组件构造函数中预置的代码,进行保存组件标识及所述函数的操作。
5、如权利要求1或4所述的组件间调用方法,其特征在于:
2)中程序加载到内存后,系统根据主程序的配置文件中预置的组件地址,读取确定目录下的组件,将组件接口集加入特定的共享内存。
CN 200510115496 2005-11-04 2005-11-04 一种组件间调用方法 Active CN100487649C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 200510115496 CN100487649C (zh) 2005-11-04 2005-11-04 一种组件间调用方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 200510115496 CN100487649C (zh) 2005-11-04 2005-11-04 一种组件间调用方法

Publications (2)

Publication Number Publication Date
CN1834918A true CN1834918A (zh) 2006-09-20
CN100487649C CN100487649C (zh) 2009-05-13

Family

ID=37002681

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 200510115496 Active CN100487649C (zh) 2005-11-04 2005-11-04 一种组件间调用方法

Country Status (1)

Country Link
CN (1) CN100487649C (zh)

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101132413B (zh) * 2007-09-18 2010-10-06 中兴通讯股份有限公司 基于Web应用的ActiveX组件的复用方法
CN102063332A (zh) * 2011-01-12 2011-05-18 中国电子科技集团公司第七研究所 一种软件通信体系结构的逻辑设备组件及其操作方法
CN101620536B (zh) * 2009-08-17 2012-11-14 用友软件股份有限公司 一种调用功能函数的方法和装置
CN102999352A (zh) * 2012-11-15 2013-03-27 中国科学院声学研究所 一种嵌入式系统组件加载方法
CN103593191A (zh) * 2013-11-19 2014-02-19 乐视致新电子科技(天津)有限公司 调用应用程序数据的方法和装置
CN101711387B (zh) * 2007-04-04 2014-05-07 屯管理顾问有限公司 移动设备的功能的对等共享
CN103809979A (zh) * 2014-02-25 2014-05-21 南京南瑞继保电气有限公司 一种人机交互软件模块集成系统及其实现方法
CN104268019A (zh) * 2014-09-23 2015-01-07 广州金山网络科技有限公司 一种软件运行方法、装置及终端
CN104424002A (zh) * 2013-09-10 2015-03-18 中国科学院声学研究所 一种基于插件机制的动态加载组件方法和系统
CN105022630A (zh) * 2015-06-30 2015-11-04 中标软件有限公司 一种组件管理系统及组件管理方法
CN105677393A (zh) * 2015-12-30 2016-06-15 中科创达软件股份有限公司 一种软件包处理方法、装置及系统
CN107145372A (zh) * 2017-05-09 2017-09-08 北京京东尚科信息技术有限公司 信息生成方法和装置
CN108419089A (zh) * 2018-02-08 2018-08-17 广州虎牙信息科技有限公司 组件数据处理方法、装置、设备及存储介质
CN111209056A (zh) * 2020-01-02 2020-05-29 北京东土科技股份有限公司 功能函数的加载方法、装置、可读存储介质及电子设备
CN113568603A (zh) * 2021-09-23 2021-10-29 广州中望龙腾软件股份有限公司 组件对象创建及接口方法调用方法、终端及存储装置
CN114461291A (zh) * 2020-10-22 2022-05-10 北京国双科技有限公司 应用程序组件调用方法、装置、电子设备及存储介质

Cited By (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101711387B (zh) * 2007-04-04 2014-05-07 屯管理顾问有限公司 移动设备的功能的对等共享
CN101132413B (zh) * 2007-09-18 2010-10-06 中兴通讯股份有限公司 基于Web应用的ActiveX组件的复用方法
CN101620536B (zh) * 2009-08-17 2012-11-14 用友软件股份有限公司 一种调用功能函数的方法和装置
CN102063332A (zh) * 2011-01-12 2011-05-18 中国电子科技集团公司第七研究所 一种软件通信体系结构的逻辑设备组件及其操作方法
CN102999352B (zh) * 2012-11-15 2016-08-10 中国科学院声学研究所 一种嵌入式系统组件加载方法
CN102999352A (zh) * 2012-11-15 2013-03-27 中国科学院声学研究所 一种嵌入式系统组件加载方法
CN104424002B (zh) * 2013-09-10 2017-12-12 中国科学院声学研究所 一种基于插件机制的动态加载组件方法和系统
CN104424002A (zh) * 2013-09-10 2015-03-18 中国科学院声学研究所 一种基于插件机制的动态加载组件方法和系统
CN103593191A (zh) * 2013-11-19 2014-02-19 乐视致新电子科技(天津)有限公司 调用应用程序数据的方法和装置
CN103809979B (zh) * 2014-02-25 2017-03-29 南京南瑞继保电气有限公司 一种人机交互软件模块集成系统及其实现方法
CN103809979A (zh) * 2014-02-25 2014-05-21 南京南瑞继保电气有限公司 一种人机交互软件模块集成系统及其实现方法
CN104268019A (zh) * 2014-09-23 2015-01-07 广州金山网络科技有限公司 一种软件运行方法、装置及终端
CN104268019B (zh) * 2014-09-23 2018-04-27 广州猎豹网络科技有限公司 一种软件运行方法、装置及终端
CN105022630A (zh) * 2015-06-30 2015-11-04 中标软件有限公司 一种组件管理系统及组件管理方法
CN105022630B (zh) * 2015-06-30 2019-01-22 中标软件有限公司 一种组件管理系统及组件管理方法
CN105677393B (zh) * 2015-12-30 2019-02-05 中科创达软件股份有限公司 一种软件包处理方法、装置及系统
CN105677393A (zh) * 2015-12-30 2016-06-15 中科创达软件股份有限公司 一种软件包处理方法、装置及系统
CN107145372A (zh) * 2017-05-09 2017-09-08 北京京东尚科信息技术有限公司 信息生成方法和装置
CN108419089A (zh) * 2018-02-08 2018-08-17 广州虎牙信息科技有限公司 组件数据处理方法、装置、设备及存储介质
CN108419089B (zh) * 2018-02-08 2021-04-27 广州虎牙信息科技有限公司 组件数据处理方法、装置、设备及存储介质
CN111209056A (zh) * 2020-01-02 2020-05-29 北京东土科技股份有限公司 功能函数的加载方法、装置、可读存储介质及电子设备
CN111209056B (zh) * 2020-01-02 2021-02-19 北京东土科技股份有限公司 功能函数的加载方法、装置、可读存储介质及电子设备
CN114461291A (zh) * 2020-10-22 2022-05-10 北京国双科技有限公司 应用程序组件调用方法、装置、电子设备及存储介质
CN113568603A (zh) * 2021-09-23 2021-10-29 广州中望龙腾软件股份有限公司 组件对象创建及接口方法调用方法、终端及存储装置
CN113568603B (zh) * 2021-09-23 2022-02-15 广州中望龙腾软件股份有限公司 组件对象创建及接口方法调用方法、终端及存储装置

Also Published As

Publication number Publication date
CN100487649C (zh) 2009-05-13

Similar Documents

Publication Publication Date Title
CN100487649C (zh) 一种组件间调用方法
US10367822B2 (en) Restrictive access control for modular reflection
US7542977B2 (en) Transactional memory with automatic object versioning
US7131110B2 (en) Method and apparatus for generating a code bridge
US6415435B1 (en) Method and apparatus for determining compatibility of parent classes in an object oriented environment using versioning
EP3350696B1 (en) Overriding a migrated method of an updated type
EP4099153A1 (en) Extending a virtual machine instruction set architecture
US10789047B2 (en) Returning a runtime type loaded from an archive in a module system
US8141070B2 (en) Bridging class loader name spaces
US20060248523A1 (en) Annotation management
KR101059633B1 (ko) 멀티태스킹 가상 머신을 위한 힙 구성
US20050071809A1 (en) System and method for serializing objects in a compiled programming language
JP2005063449A (ja) オブジェクトからオブジェクトへのJavaネイティブインタフェースマッピングの方法及び装置
US20020147971A1 (en) Object-oriented class loading system and method
US9152456B2 (en) Efficient per-thread safepoints and local access
US11048489B2 (en) Metadata application constraints within a module system based on modular encapsulation
US20180268158A1 (en) Identifying permitted illegal access operations in a module system
US20180081677A1 (en) Using Annotation Processors Defined By Modules with Annotation Processors Defined By Non-Module Code
US20070220531A1 (en) Method and system for shimming COM objects
Gregersen et al. Towards a Dynamic-update-enabled JVM
US7308679B2 (en) Method and computer program product for providing a meta-data programming language level interface
US11243876B2 (en) Techniques for accessing off-heap memory
US11803487B2 (en) Transitioning between thread-confined memory segment views and shared memory segment views
KR20120114926A (ko) 바이너리 실행파일 생성을 위한 프로그래밍 방법
Taylor et al. More Best Practices

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: BEIJING KINGSOFT OFFICE SOFTWARE CO., LTD.

Free format text: FORMER OWNER: BEIJING JINSHAN SOFTWARE CO., LTD.

Effective date: 20140312

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 100083 HAIDIAN, BEIJING TO: 100085 HAIDIAN, BEIJING

TR01 Transfer of patent right

Effective date of registration: 20140312

Address after: Kingsoft No. 33 building, 100085 Beijing city Haidian District Xiaoying Road

Patentee after: Beijing Kingsoft WPS Office Co., Ltd.

Address before: 100083 Bai Yan building, 238 middle Fourth Ring Road, Haidian District, Beijing

Patentee before: Beijing Jinshan Software Co., Ltd.

CP01 Change in the name or title of a patent holder

Address after: Kingsoft No. 33 building, 100085 Beijing city Haidian District Xiaoying Road

Patentee after: Beijing Kingsoft office software Limited by Share Ltd

Address before: Kingsoft No. 33 building, 100085 Beijing city Haidian District Xiaoying Road

Patentee before: Beijing Kingsoft WPS Office Co., Ltd.

CP01 Change in the name or title of a patent holder