功能函数的加载方法、装置、可读存储介质及电子设备转让专利

申请号 : CN202010003063.8

文献号 : CN111209056B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张聪颜合陆需飞

申请人 : 北京东土科技股份有限公司

摘要 :

本发明提供了一种功能函数的加载方法,包括程序模块,其包括:至少一子模块和至少一功能函数;所述加载方法包括:所述程序模块通过对外接口收到宿主程序的指令时,加载一子模块;所述宿主程序的指令是宿主程序要加载至少一功能函数时或一子模块发出;由该子模块创建一模块对象,将所要加载的功能函数,或所要加载的子模块对应的各功能函数注册到该模块对象中提供给宿主程序。还相应的提供了功能函数的加载装置、可读存储介质及电子设备。使用本发明,可以在功能函数的动态加载时降低对操作系统的依赖。

权利要求 :

1.一种功能函数的加载方法,其特征在于,包括程序模块,其包括:至少一子模块和至少一功能函数;所述程序模块为两个以上,不同的程序模块包括不同的功能函数;

所述加载方法包括:

宿主程序要加载至少一功能函数以使用所加载的功能函数时,从各所述程序模块中确定出提供该功能函数的程序模块,并发出一指令;

所述程序模块通过对外接口收到宿主程序的指令时,加载一子模块;

由该子模块创建一模块对象,将所要加载的功能函数注册到该模块对象中提供给宿主程序;

宿主程序建立对应所加载的各功能函数的功能函数代理表,以通过该功能函数代理表调用所述功能函数。

2.一种功能函数的加载方法,其特征在于,包括程序模块,其包括:至少一子模块和至少一功能函数;所述程序模块为两个以上,不同的程序模块包括不同的功能函数;还包括一子模块注册表,用于记录该程序模块所具有的子模块;

所述加载方法包括:

宿主程序要加载至少一功能函数以使用所加载的功能函数时,从各所述程序模块中确定出提供该功能函数对应的功能的子模块,并发出一指令;

所述程序模块通过对外接口收到宿主程序的指令时,判断子模块注册表中是否记载有所要加载的子模块,据此继续或退出所述加载方法;当为继续所述加载方法时,加载该指令对应的所述子模块;

由该子模块创建一模块对象,将该子模块对应的各功能函数注册到该模块对象中提供给宿主程序;

宿主程序建立对应所加载的各功能函数的功能函数代理表,以通过该功能函数代理表调用所述功能函数。

3.一种功能函数的加载装置,其特征在于,包括:

程序模块,其包括:至少一子模块和至少一功能函数;所述程序模块为两个以上,不同的程序模块包括不同的功能函数;

子模块加载单元,用于所述程序模块通过对外接口收到宿主程序的指令时,加载一子模块;所述宿主程序的指令是宿主程序要加载至少一功能函数时发出;

模块对象创建单元,用于由所述子模块创建一模块对象;

功能函数注册单元,用于将所要加载的功能函数注册到所述模块对象中提供给宿主程序;

由宿主程序建立的对应所加载的各功能函数的功能函数代理表,用于通过该功能函数代理表调用所述功能函数。

4.一种功能函数的加载装置,其特征在于,包括:

程序模块,其包括:至少一子模块和至少一功能函数;所述程序模块为两个以上,不同的程序模块包括不同的功能函数;

子模块加载单元,用于所述程序模块通过对外接口收到宿主程序的指令时,加载该指令对应的一子模块;所述宿主程序的指令是宿主程序要加载一子模块时发出;

模块对象创建单元,用于由所述子模块创建一模块对象;

功能函数注册单元,用于将该子模块对应的各功能函数注册到所述模块对象中提供给宿主程序;

所述程序模块还包括一子模块注册表,用于记录该程序模块所具有的子模块;

所述加载装置还包括一判断模块,用于在加载一子模块前,判断子模块注册表中是否记载有所要加载的子模块,据此继续或退出所述子模块的加载;

由宿主程序建立的对应所加载的各功能函数的功能函数代理表,用于通过该功能函数代理表调用所述功能函数。

5.一种可读存储介质,其特征在于,所述可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使所述计算机执行权利要求1至2任一所述的方法。

6.一种电子设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至2任一所述的方法。

说明书 :

功能函数的加载方法、装置、可读存储介质及电子设备

技术领域

[0001] 本发明涉及一种功能函数的加载方法、装置、可读存储介质及电子设备。

背景技术

[0002] 函数库由可被重复使用的各功能函数(简称函数)构成,每个函数由自定义的变量与执行函数构成,通过链接一函数以执行该函数代码以完成该函数提供的功能。函数库可以分为静态链接库(SLL,Static Link Library)和动态链接库(DLL,Dynamic Link Library)。
[0003] 静态链接库通常在应用程序编译时期完成调用函数链接,使所链接的库函数代码集成到编译生成的应用程序的可执行文件(如exe文件)中。这使得当有多个应用程序都使用一相同的库函数时,内存中就会存在这个库函数代码的多个拷贝,会占用较多的内存资源。
[0004] 而动态链接库的库函数代码并没有被拷贝到应用程序的可执行文件中去,仅当应用程序被装入内存运行时,在操作系统(如Microsoft Windows)的管理下,通过调用操作系统的动态连接器去加载DLL,以加载相应库函数(库函数的可执行代码位于一DLL文件中),执行该DLL中库函数的功能,包括重定位。可见,相对于动态链接库来说,当有多个应用程序都使用一相同的库函数时,内存中只存在一个库函数代码,会节省较多的内存资源,因此目前多采用基于动态链接库的方式来实现对库函数的调用。例如,对于不同的软件去访问硬件时,各个软件执行时通过加载该硬件的驱动DLL来实现,而并不需要每个程序中预先写入该硬件的驱动代码。
[0005] 由上,操作系统可以通过其动态链接器对驱动DLL的调用,来实现对硬件的对于驱动的调用
[0006] 但目前,基于动态链接库的方式由于需要在操作系统的管理下(通过操作系统的动态连接器)去加载DLL,使得其对操作系统的依赖性比较强,需操作系统提供动态连接器。由于其加载依赖于OS动态链接器,因此功能函数代码的可移植性被限制。
[0007] 如何能够提供一种降低对操作系统依赖的功能函数的动态加载方法,是有待解决的技术问题。

发明内容

[0008] 有鉴于此,本发明的主要目的在于提供了一种功能函数的加载方法、装置、可读存储介质及电子设备,以在对功能函数动态加载时降低对操作系统的依赖。
[0009] 本发明提供的一种功能函数的加载方法,包括程序模块,其包括:至少一子模块和至少一功能函数;所述加载方法包括:
[0010] 所述程序模块通过对外接口收到宿主程序的指令时,加载一子模块;所述宿主程序的指令是宿主程序要加载至少一功能函数时发出;
[0011] 由该子模块创建一模块对象,将所要加载的功能函数注册到该模块对象中提供给宿主程序。
[0012] 由上,通过上述步骤,实现了宿主程序对所需功能函数的动态加载。并且,由于功能函数是在程序模块内被加载到子模块的模块对象后(这个加载过程由程序模块完成,与操作系统动态链接器无关)提供给宿主程序,该所需功能函数的加载过程不依赖与操作系统平台,相对于背景技术降低了对操作系统动态链接器的依赖,因此与操作系统的耦合性更松散,进而减少了操作系统平台代码的依赖,增强了程序模块的代码可移植性,从而更易实现接口的ABI技术。并且,由于各功能函数的注册相对在程序模块内部完成,因此,即使出现其他程序模块中的功能函数名称定义相同,宿主程序在调用过程中也不会出现调用出错问题。
[0013] 本发明提供的另一种功能函数的加载方法,包括程序模块,其包括:至少一子模块和至少一功能函数;所述加载方法包括:
[0014] 所述程序模块通过对外接口收到宿主程序的指令时,加载该指令对应的一子模块;所述宿主程序的指令是宿主程序要加载一子模块时发出;
[0015] 由该子模块创建一模块对象,将该子模块对应的各功能函数注册到该模块对象中提供给宿主程序。
[0016] 由上,通过上述步骤,实现了宿主程序对所需子模块对应的功能函数的动态加载。并且,由于功能函数是在程序模块内被加载到子模块的模块对象后(这个加载过程由程序模块完成,与操作系统动态链接器无关)提供给宿主程序,该子模块对应的功能函数的加载过程不依赖与操作系统平台,相对于背景技术降低了对操作系统动态链接器的依赖,因此与操作系统的耦合性更松散,进而减少了操作系统平台代码的依赖,增强了程序模块的代码可移植性,从而更易实现接口的ABI技术。并且,由于各功能函数的注册相对在程序模块内部完成,因此,即使出现其他程序模块中的功能函数名称定义相同,宿主程序在调用过程中也不会出现调用出错问题。
[0017] 可选的,所述程序模块还包括一子模块注册表,用于记录该程序模块所具有的子模块;相应的所述加载方法还包括:在所述加载一子模块前,判断子模块注册表中是否记载有所要加载的子模块,据此继续或退出所述加载方法。
[0018] 可选的,所述程序模块为两个以上,不同的程序模块包括不同的功能函数;所述收到宿主程序的指令的程序模块,是被判断具有所要加载的功能函数的程序模块。
[0019] 由上,通过子模块注册表可以获知该通信程序模块所具有的通信协议及对应的子协议模块信息,便于判断程序模块是否具有所要加载的功能函数或模块。
[0020] 可选的,还包括:宿主程序建立对应所加载的各功能函数的功能函数代理表。
[0021] 本发明提供的一种功能函数的加载装置,包括:
[0022] 程序模块,其包括:至少一子模块和至少一功能函数;
[0023] 子模块加载单元,用于所述程序模块通过对外接口收到宿主程序的指令时,加载一子模块;所述宿主程序的指令是宿主程序要加载至少一功能函数时发出;
[0024] 模块对象创建单元,用于由所述子模块创建一模块对象;
[0025] 功能函数注册单元,用于将所要加载的功能函数注册到所述模块对象中提供给宿主程序。
[0026] 本发明提供的另一种功能函数的加载装置,包括:
[0027] 程序模块,其包括:至少一子模块和至少一功能函数;
[0028] 子模块加载单元,用于所述程序模块通过对外接口收到宿主程序的指令时,加载该指令对应的一子模块;所述宿主程序的指令是宿主程序要加载一子模块时发出;
[0029] 模块对象创建单元,用于由所述子模块创建一模块对象;
[0030] 功能函数注册单元,用于将该子模块对应的各功能函数注册到所述模块对象中提供给宿主程序。
[0031] 可选的,所述程序模块还包括一子模块注册表,用于记录该程序模块所具有的子模块;
[0032] 所述加载装置还包括一判断模块,用于在加载一子模块前,判断子模块注册表中是否记载有所要加载的子模块,据此继续或退出所述加载方法。
[0033] 本发明提供的一种可读存储介质,所述可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使所述计算机执行上述任一所述的方法。
[0034] 本发明提供的一种电子设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现任一所述的功能函数的加载方法。

附图说明

[0035] 图1为功能函数的加载方法的原理图;
[0036] 图2为功能函数的加载方法的流程图。

具体实施方式

[0037] 为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述。
[0038] 本发明功能函数加载方法参见图1所示功能函数的加载方法的原理图,简述如下:由程序模块提供各子模块、各功能函数,各子模块可以动态加载所需的功能函数,当宿主程序(Host,即软件运行环境)需要加载某个或某些功能函数时,首先从多个程序模块中确定出提供该功能函数的程序模块,由宿主程序访问该程序模块,然后由该程序模块加载一子模块,并由该子模块创建一模块对象,将所要加载的各功能函数注册到该模块对象中,并使宿主程序建立对应所加载的各功能函数的一功能函数代理表。当宿主程序运行时,通过该功能函数代理表实现对所需要调用的功能函数的调用。
[0039] 另一方面,在设计各子模块时,可以设计各个子模块用于提供不同的子模块功能,当宿主程序需要加载某子模块以使用该子模块的功能时,由宿主程序访问该程序模块,由程序模块加载该子模块后,由该子模块创建一模块对象,将实现该子模块功能的各功能函数注册到该模块对象中,并使宿主程序建立对应所加载的各功能函数的一功能函数代理表。通过功能函数代理表对相应的各功能函数的调用,实现宿主程序对所述子模块功能的调用。
[0040] 下面将本发明应用于宿主程序如何加载一通信协议为例,对本发明进行说明。该实施例中,程序模块为通信程序模块,所包含的各子协议模块分别对应各子模块,所包含的各功能函数可被动态加载到子模块。当宿主程序要加载某通信协议时(即要加载该通信协议对应的功能函数),访问提供该通信协议的通信程序模块,然后加载对应的一子协议模块,并由该子协议模块创建一模块对象,将所要加载的通信协议所使用的各功能函数注册到该模块对象中,并使宿主程序建立对应所加载的通信协议的各功能函数的一功能函数代理表,以使宿主程序通过该功能函数代理表对通信协议的各功能函数的调用,即实现了宿主程序对该子协议模块对应的通信协议的加载。
[0041] 预先需要说明的是,上述各个子通信协议被分配有不同的ID编码,并被分配给不同的子协议模块(即相当于使各个子协议模块用于提供不同的通信协议),例如ID编码为8001用来表示ModbusRTU协议,分配给对应ModbusRTU协议的子协议模块,ID编码为8002用来表示ModbusTCP协议,分配给对应ModbusTCP协议的子协议模块。并且,为通信程序模块设置一子模块注册表,该子模块注册表记录有该通信程序模块内部的子协议模块及所分配的上述ID编码。也即,通过该子模块注册表可以获知该通信程序模块所具有的通信协议及对应的子协议模块信息。
[0042] 下面参见图1和图2,以宿主程序动态加载ModbusRTU协议为例,对本发明进行详细说明,包括以下步骤:
[0043] S210、当宿主程序运行过程中,需要加载ModbusRTU协议时,首先从各通信程序模块查找出具有ModbusRTU协议的通信模块,然后执行创建子模块指令,并通过该指令访问所选出的通信程序模块提供的对外接口,并将对应的ModbusRTU协议的ID编码,即8001传入该通信程序模块。
[0044] 需要说明的是,在开发不同的通信模块时,每个通信程序模块设置一用来存储该通信模块所包含的各协议ID编号的程序元数据(该程序元数据所记录内容即所述子模块注册表中的各协议ID编码),宿主程序启动时,会提前从各通信程序模块获取该程序元数据并解析出协议ID编号,并建立协议ID编码的索引表。这样当宿主程序需要加载某协议时,可以根据该索引表查找出对应的通信模块,并将所要加载的协议的ID编码传入该通信程序模块。
[0045] S220、通信程序模块通过对外接口收到所述创建子模块指令以及对应ModbusRTU协议的ID编码8001,查找子模块注册表,以确定出对应该ModbusRTU协议的子协议模块。当未在子模块注册表中查到该ID编码的记录时,表示该通信程序模块不包括可提供ModbusRTU协议函数的子协议模块,该结束本流程;若查到,则确定出所对应的子模块,继续下一步。本例中所确定出的对应ID编码为8001的子协议模块为第一子协议模块(即图1中示出的子模块1)。
[0046] S230、加载所确定出的第一子协议模块,该第一子协议模块调用查询接口(Query Entry),由该查询接口对应的查询程序根据ModbusRTU协议的ID编码8001,查找到对应该ID编码的创建模块对象接口(Creat Driver),加载该创建模块对象接口对应的创建模块对象程序,据此创建一模块对象。
[0047] 需要说明的是,不同的子通信协议会对应不同的创建模块对象接口,即会根据不同协议的ID编码查找到对应的不同的创建模块对象接口,从而加载不同的创建模块对象程序,以创建不同的模块对象,以用于下述步骤S240中不同的功能函数的注册。
[0048] S240、将构成ModbusRTU协议所需的各子模块功能函数注册到所创建的模块对象中。
[0049] 具体的,由第一子协议模块将一句柄(Handle,用于对象或资源的标识或索引)传入所创建的模块对象,将构成ModbusRTU协议所需的各功能函数(如图1中示出的功能函数1~6)与该句柄绑定,完成各功能函数到所创建的模块对象的注册。
[0050] S250、将注册到模块对象中的子模块功能函数返回宿主程序,在宿主程序端生成对应各功能函数的功能函数代理表。
[0051] 具体的,通过所述句柄(Handle)将所绑定的各个功能函数传给宿主程序,宿主程序设有一功能函数代理表,该表设置有各个功能的函数槽(槽是应用于对象之间的通信接口),将各个功能函数注册到相应功能的函数槽中,建立各功能的函数槽与所加载的第一子协议模块的各功能函数的对应关系,从而当宿主程序需要调用某功能函数时,可以直接通过该功能函数代理表链接到对应的功能函数。
[0052] 例如,函数槽第一槽的功能是打开设备功能(OpenDevice),则将表示打开设备的功能函数注册到该函数槽;第二和第四槽分别是读功能(Read)和写功能(Write),则分别将表示读、写的功能函数注册到这两个函数槽。
[0053] S260、至此,宿主程序的ModbusRTU协议动态加载完毕。当宿主程序需使用该协议进行操作时,可根据功能函数代理表调用对应的功能函数。
[0054] 另外,如果宿主程序需要使用两种通信协议时,则可以针对不同通信协议分别执行上述步骤即可。例如,当需要同时加载ModbusTCP协议时,则再次执行上述步骤即可,相应的:在步骤S210中传入该通信程序模块的ID编码为对应ModbusTCP协议的8002;在步骤S220中,确定出对应该ModbusTCP协议的子协议模块为第二子协议模块(即图1中示出的子模块2);在步骤S230中,根据ID编码8002查找到对应的创建模块对象接口(Creat Driver);在步骤S240和S250中,将构成ModbusTCP协议所需的各功能函数与句柄绑定,返回宿主程序以生产对应该各功能函数的功能函数代理表。
[0055] 当宿主程序不再使用ModbusRTU协议时,可由宿主程序通过通信程序模块提供的对外接口向通过通信程序模块传入注销指令,以释放相应的资源。
[0056] 通过上述步骤,实现了宿主程序根据需要来加载所需的协议,从而实现了该宿主程序对该协议的支持。并且,如步骤S230-S240,程序模块也实现了协议所需各功能函数的动态加载。如上述步骤S210-S220,通信程序模块对外提供一对外接口来接收指令完成来实现各功能函数的加载,相对于背景技术降低了对操作系统动态链接器的依赖,因此与操作系统的耦合性更松散,进而减少了操作系统平台代码的依赖,增强了程序模块的代码可移植性。并且,如步骤S240,由于各功能函数的注册相对在程序模块内部完成,因此,即使出现其他程序模块中的功能函数名称定义相同,宿主程序在调用过程中也不会出现调用出错问题。
[0057] 在另一个实施例中,本发明还相应的提供了一种应用于上述功能函数的加载方法的程序模块,包括:至少一子模块和至少一功能函数;所述子模块用于当程序模块通过对外接口收到宿主程序的指令时创建一模块对象,所述功能函数可被选择的注册到该模块对象中;所述宿主程序的指令是宿主程序要加载至少一功能函数或一子模块时发出。
[0058] 在另一个实施例中,本发明还相应的提供了一种功能函数的加载装置,包括:
[0059] 程序模块,其包括:至少一子模块和至少一功能函数;
[0060] 子模块加载单元,用于所述程序模块通过对外接口收到宿主程序的指令时,加载一子模块;所述宿主程序的指令是宿主程序要加载至少一功能函数时发出;
[0061] 模块对象创建单元,用于由所述子模块创建一模块对象;
[0062] 功能函数注册单元,用于将所要加载的功能函数注册到所述模块对象中提供给宿主程序。
[0063] 在另一个实施例中,本发明还相应的提供了一种功能函数的加载装置,包括:
[0064] 程序模块,其包括:至少一子模块和至少一功能函数;
[0065] 子模块加载单元,用于所述程序模块通过对外接口收到宿主程序的指令时,加载该指令对应的一子模块;所述宿主程序的指令是宿主程序要加载一子模块时发出;
[0066] 模块对象创建单元,用于由所述子模块创建一模块对象;
[0067] 功能函数注册单元,用于将该子模块对应的各功能函数注册到所述模块对象中提供给宿主程序。
[0068] 可选的,所述程序模块还包括一子模块注册表,用于记录该程序模块所具有的子模块;所述加载装置还包括一判断模块,用于在加载一子模块前,判断子模块注册表中是否记载有所要加载的子模块,据此继续或退出所述加载方法。
[0069] 在另一个实施例中,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使所述计算机执行上述实施例中所述功能函数的加载方法。
[0070] 在另一个实施例中,本发明还提供了一种电子设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现任一所述的功能函数的加载方法。
[0071] 在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现、当使用软件程序实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述指令可以存储在计算机存储介质中,或者从一个计算机存储介质向另一个计算机存储介质传输,例如,所述指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带、磁光盘(MO)等)、光介质(例如,CD、DVD、BD、HVD等)、或者半导体介质(例如ROM、EPROM、EEPROM、非易失性存储器(NAND FLASH)、固态硬盘(Solid State Disk,SSD))等。本领域内的技术人员应明白,本申请实施例可提供为方法、系统、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0072] 本申请实施例是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0073] 这些指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0074] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。