调用动态库的方法、装置及动态库服务器的制作方法

文档序号:6574485阅读:199来源:国知局
专利名称:调用动态库的方法、装置及动态库服务器的制作方法
技术领域
本发明涉及操作系统领域,特别是调用动态库的方法、装置及动态库服务器。
背景技术
动态库作为操作系统结构中必不可少的一部分,用于将一个复杂的程序分解为多个不同的部分,提供给不同开发者/厂家来完成。
目前,调用动态库的方式通常为将动态库与可执行程序放在一台计算机上,在编译可执行程序时链接,或在可执行程序运行时加载指定文件,从而实现可执行程序调用动态库中的一个或多个函数的功能。不管是采用链接的方式还是采用动态加载的方式,动态库都是作为可执行程序的一部分,被加载到可执行程序的某段地址空间中,并像调用本地函数一样地调用。
然而,采用现有的这种动态库的调用方式,也带来了一些问题。首先就是有可能会造成主程序的不稳定。因为动态库可能是第三方提供的,主程序的提供者难以控制其质量,在动态库中可能会出现的诸如内存泄露、指针异常访问等严重缺陷,将直接导致主程序的运行异常。并且一旦主程序出现异常,由于其复杂而庞大的结构,问题的定位也较为困难。
其次,现有的动态库也不能灵活配置。基于某个操作系统的主程序,其只能调用该系统下的动态库,如果想要调用其它操作系统下的动态库,则需要将该动态库重新编译并移植到本操作系统中。有时甚至在与主程序基于不同版本的操作系统或编译器的情况下,都有可能需要重新编译动态库。并且,一个Windows下的主程序,如果要将其移植到Unix下,其相应的动态库也要同时被移植,否则该程序将无法正常运行,反之亦然。

发明内容
有鉴于此,本发明实施例的目的在于提供调用动态库的方法,用于实现动态库发生异常时的问题准确定位,并提高动态库的可移植性。
本发明实施例的另一目的在于提供调用动态库的装置,用于提高动态库问题定位准确性和动态库的可移植性。
本发明实施例的第三目的在于提供一种动态库服务器,用于实现主程序与动态库函数调用相分离。
本发明的实施例提供了一种调用动态库的方法,包括主程序向动态库服务器发送调用动态库中函数的请求消息,所述请求消息中携带有调用函数的参量;动态库服务器根据所述参量调用动态库中的函数,并在响应消息中向主程序返回函数执行结果。
本发明的实施例还提供了一种调用动态库的装置,包括主程序执行单元,用于发送请求消息调用动态库中的函数,所述请求消息中携带有调用函数的参量;动态库服务器,用于根据所述参量完成动态库单元中函数的调用,并在响应消息中向所述主程序执行单元返回函数的执行结果;动态库单元,用于根据所述动态库服务器的调用请求运行所述函数,并向动态库服务器上报执行结果。
本发明的实施例还提供了一种动态库服务器,包括加载模块,用于在启动时将自身管理的动态库加载到本地;消息处理模块,用于接收主程序发送的携带有调用函数的参量的请求消息,并根据所述参量发送调用指令;将执行结果通过响应消息返回给主程序;调用模块,用于根据所述调用指令中的函数名及参数列表调用对应的函数,并将函数的执行结果上报给所述消息处理模块。
本发明的实施例将主程序对动态库的调用通过动态库服务器来执行,主程序与动态库服务器间采用消息机制传送参数和数据,从而实现了动态库的错误仅会影响到动态库服务器,而主程序仅仅在响应消息中得到出错信息,不会影响主程序的运行;另一方面,本发明的实施例允许主程序与动态库服务器基于不同的操作系统,可以设置于不同的计算机上,提高了动态库的可移植性。


图1为本发明的实施例中调用动态库的方法流程图;图2为本发明的实施例中主程序、动态库服务器及动态库三者间的关系示意图;图3为本发明的实施例中调用动态库的装置结构图。
具体实施例方式
本发明的实施例将主程序对动态库的调用通过动态库服务器来执行,主程序与动态库服务器间采用消息机制传送参数和数据,实现了动态库的错误仅会影响到动态库服务器,而主程序仅仅在响应消息中得到出错信息,不会影响主程序的运行;另一方面,本发明的实施例允许主程序与动态库服务器基于不同的操作系统,可以设置于不同的计算机上,提高了动态库的可移植性;并且,将主程序移植到其它系统上执行时,不必将动态库全部也移植过来,从而也减少了产品移植的时间。
为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。
如图1所示,为本发明的实施例中调用动态库的方法流程图,该方法可分为初始化和函数调用两个部分,具体包括以下步骤步骤101、动态库服务器加载动态库。动态库服务器在部署完成后便会启动,启动时即执行该步骤,以获取自身管理的动态库。
在目前通用的操作系统Windows和Unix中,用于完成加载动态库功能的语句有所不同,在Windows系统中,使用load library函数,而在Unix系统中,则是使用dlopen函数。通过执行加载语句,动态库服务器获得了自身管理的动态库的句柄。
在本发明的实施例中,动态库服务器与其加载的动态库必须设置于同一台设备上,这是因为基于现有的Windows和Unix操作系统架构,所述loadlibrary函数和dlopen函数都只能加载本地计算机的动态库。
步骤102、主程序请求获得动态库服务器已加载成功的动态库列表。
在本发明的实施例中,动态库服务器能够加载并管理多个动态库。通过执行步骤101,动态库服务器获取了自身管理的所有动态库的句柄,而此时主程序还不知道动态库服务器具体加载了哪个/些动态库,因此要通过本步骤来获取已加载成功的动态库列表。
步骤103、动态库服务器向主程序返回已加载成功的动态库列表。该列表中包含了加载的动态库的名称,例如a.dll、b.dll等动态库。
在本发明的实施例中,主程序与动态库服务器的关系为多对多,即一个主程序可以向多个动态库服务器发送函数调用请求,而一个动态库服务器所管理的动态库可以被多个主程序所调用。主程序、动态库服务器及动态库三者间的关系如图2所示。其中,主程序1可以调用动态库服务器1、2和n,动态库服务器1管理的动态库包括a.dll,依此类推。
在动态库中,各函数的调用可能是有先后关系的。比如一些动态库要求先要调用一个初始化(init)函数,完成分配缓存(buffer)、初始化变量等功能,然后再调用执行(exe)函数,完成该函数的调用。对于这两个函数而言,其执行顺序是固定的,即init函数一定在exe函数前被调用,如果该函数未被初始化而直接调用exe,则会导致该函数的执行出错。另一种情况是动态库中保存有某种状态,不同函数的调用会导致该状态的变更,例如打开文件(open)、写入(do)和关闭文件(close)这三个函数,执行open打开了一个文件,执行do向该文件中写入,执行close关闭该文件,该执行顺序一旦出错,必然会导致对该文件操作的失败。正确的执行顺序是由动态库的使用者来保证的,该使用者必须按照正确的顺序去调用具有先后次序的函数,然而存在另一个使用者无法决定的问题,当具有先后执行顺序的各函数分配给了不同的动态库服务器,例如init函数和exe函数被分配给了不同动态库服务器,即使使用者按照正确的顺序调用这两个函数,这两个调用请求被发送给了不同的动态库服务器,执行init函数的动态库服务器获得了该函数的句柄,然而调用exe函数的另一动态库服务器由于没有该函数句柄,导致无法正确执行该函数。对于文件操作的情况也类似,如果open、do和close这三个函数由不同的动态库服务器管理,而这些动态库服务器可能设置于不同的物理设备上,那么即使使用者按照正确的顺序去调用这三个函数,这些函数也无法针对同一文件进行操作。
为了解决前述问题,本发明的实施例提出了会话组(session)的概念,将具有先后调用关系的一组函数设置为一个session,具有相同的session_id,而具有相同session_id的一组函数调用由同一动态库服务器管理。在主程序中,对于具有同一session_id的一组函数调用也只会发送给同一动态库服务器。
通过以上步骤,就完成了对于动态库服务器的初始化,主程序也获得了各动态库服务器加载成功的动态库列表,下面的流程则是执行具体的函数调用。
步骤104、主程序要求调用动态库中的函数。假设此处要求调用的是a.dll动态库中的func1函数,a.dll为动态库名,func1为函数名。
步骤105、主程序向动态库服务器发送函数调用的请求消息。请求消息中携带有调用函数的参量,所述参量包括动态库名、函数名及参数列表。
主程序查阅动态库列表,向所述a.dll动态库所隶属的动态库服务器发送请求消息,消息中携带动态库名、函数名及参数列表。参数列表中包括各参数的类型、长度及参数值等。
步骤106、动态库服务器接收到请求消息后,根据动态库名及函数名调用相应函数执行。
基于不同操作系统的动态库服务器调用函数的语句有所不同,依然以Windows和Unix操作系统为例,在Windows系统中,动态库服务器根据动态库的名称a.dll,以步骤101中获得的该动态库的句柄及要调用的函数名func1为输入参数,使用get proc address语句,在Unix系统中,则是使用dlsym语句,执行该语句后,动态库服务器获得了欲调用函数的地址。根据该地址,动态库服务器使用请求消息中对应该函数的参数作为输入参数,执行该函数。在执行正确的情况下,动态库服务器获得该函数的执行结果和输出参数列表。
步骤107、动态库服务器向主程序返回响应消息,消息中携带函数的执行结果。该执行结果包括函数执行的返回值及输出参数列表。
在本发明的实施例中,主程序和动态库服务器之间由于是采用消息机制来传送数据的,因此二者可以设置于同一台计算机上,也可以设置在不同的计算机上。当设置在不同计算机上时,二者通过网络连接来传递消息。网络连接中传送的数据采用的是网络字节序,而不同操作系统所使用的字节序则可能与网络字节序不同。以Windows操作系统为例,其采用的就是网络字节序相反的Windows字节序。假设四字节数据的网络字节序为01,02,03,04,则其Windows字节序为04,03,02,01。非网络字节序的数据在网络中传输时,会导致传输出错;同样,当主程序基于的操作系统与动态库服务器基于的操作系统使用不同字节序时,也会导致对端接收到的数据出错。
为解决以上问题,本发明的实施例采用了将数据的字节序在主程序作为发送端或动态库服务器作为发送端时,统一为网络字节序的方案,即在消息的发送端,把数据的字节序强制转换为网络字节序。
具体包括如果发送端的操作系统采用的是Windows字节序,并且传输的数据具有明确的参数类型,如单字节整型、单字节整型指针、二字节整型(short)、二字节整型指针(short*)、四字节整型(long)、四字节整型指针(long*)、double、double*,则操作系统使用特定的转换语句,例如针对short和short*数据,使用htons语句转换为网络字节序,针对long和long*数据,则使用htonl语句转换。在将网络字节序数据传送到对端后,如果对端支持Windows字节序,则还要通过ntohs和ntohl语句将数据的字节序恢复。这种转换方式通过消息机制来实现,发送端在构造消息时,判断消息中携带的参数或数据是否为前述类型,如果是,则通过相应语句将其转换为网络字节序,接收端接收到该消息后,再根据需要将参数或数据转换为本机字节序。
然而在实际应用中,还存在另一种情形,就是传输的数据没有明确的参数类型,动态库与动态库的使用者使用了非通用的字节序。此时,则要由动态库的使用者和动态库约定字节序的实现。例如extern″C″serviceapi(char*pStruct){struct MYSTRUCT*pstr=(struct MYSTRUCT*)pStruct;……}struct MYSTRUCT*语句的功能是将参数pStruct强制转换为动态库与使用者约定的MYSTRUCT结构,这一转换在发送端完成,在接收端将字节序恢复。
extern″C″serviceapi(char*pStruct){unsigned short usRealValue;memcpy(&usRealValue,pStruct,sizeof(usRealValue))……}Memcpy语句的功能是将一个缓存器的内容复制到另一缓存器中,其三个输入参数中,前两个参数是缓存器地址,第三个参数为复制内容的大小。usRealValue为short型,大小为2字节,因此将pStruct缓存器中的2字节数据复制到usRealValue中,从而也将pStruct缓存器的数据类型也转换为了usRealValue缓存器的数据类型。
通过以上方法,就实现了对网络字节序与非网络字节序的转换,在一定程度上保证了主程序与动态库服务器间网络数据传输的准确性。
采用如图1所示的调用动态库的方法,实现了不论动态库处于哪种系统环境下,都可以被主程序所调用,使得系统整体架构更为灵活。如果出于市场需求的考虑,要将主程序移植到不同的操作系统下运行,利用图1所示的方法,就避免了第三方的动态库没有移植而导致的程序无法运行的问题,从而降低了不同厂家产品的移植风险,并且由于一些动态库没有移植,也节省了产品的移植时间。而由于存在着兼容性的问题,有些技术是很难被移植到别的操作系统下的,比如Windows下的Com技术,此时可把它们做成动态库,仍然放在Windows系统下运行,这样就又降低了产品移植的技术风险。
另外,采用图1所示的方法,动态库的异常不会影响到主程序,保证了主程序运行的稳定性。由于动态库是被动态库服务器加载与执行的,即使动态库存在执行错误,该错误被转移到了动态库服务器上,而主程序仅仅会收到出错的响应消息,不会因为该错误导致主程序运行异常,并且通过该出错的响应消息,主程序能够准确获知哪个动态库发生错误,从而实现了故障快速定位。
最后,由于本发明的实施例中动态库服务器可以有多个,其中的一个发生异常不会影响到其它动态库服务器,这也从另一方面保证了业务运行的稳定性。
如图3所示,为本发明的实施例中调用动态库的装置结构图,具体包括主程序执行单元31,用于在运行主程序的过程中,通过发送请求消息调用动态库中的函数,所述请求消息中携带有调用函数的参量。
动态库服务器32,用于根据所述参量完成所述函数的调用,并在响应消息中向所述主程序执行单元返回函数执行结果及输出参数;动态库单元33,用于根据动态库服务器32的请求运行所述函数,并向动态库服务器上报函数执行结果及输出参数。
所述主程序执行单元31与动态库服务器32可以设置不同的计算机设备上,而动态库服务器32与动态库33则必须设置于同一台计算机设备上。
其中,所述动态库服务器32又可以具体包括加载模块321,用于在所述动态库服务器启动时将自身管理的动态库加载到本地。加载模块在动态库服务器启动时加载动态库,加载的结果是获得动态库的句柄。并通过初始化流程,将加载成功的动态库的列表发送给主程序。
消息处理模块322,用于接收所述主程序执行单元发送的请求消息,并根据消息中携带的动态库名、函数名及参数列表发送调用指令;将函数的执行结果及输出参数通过响应消息返回给所述主程序执行单元。在消息创建的过程中,由主程序模块和消息处理模块完成字节序的转换,使用统一的网络字节序来传输参数或数据。
调用模块323,用于根据所述调用指令中的函数名及参数列表调用相应的函数,并将执行结果及返回参数上报给所述消息处理模块。
为简便起见,在图3中,仅仅对一个动态库服务器描述了其内部结构,其它与此相同,并且主程序执行单元、动态库服务器及动态库三者之间的对应关系与图2相似。
在本发明的另一实施例中,提供了一种动态库服务器,包括加载模块,用于在启动时将自身管理的动态库加载到本地,并向主程序返回加载成功的动态库的列表;消息处理模块,用于接收主程序发送的请求消息,并根据消息中携带的动态库名、函数名及该函数的参数列表等参量发送调用指令;将函数的执行结果通过响应消息返回给主程序;调用模块,用于根据所述调用指令中的函数名及参数列表调用对应的函数,并将执行结果及输出参数上报给所述消息处理模块。
所述动态库服务器的实现采用了模块化的方式,功能与结构都相对简单,可以较为容易地做到在不同的操作系统下都可以编译执行,这样就使得不同操作系统下的动态库都可以有相应的动态库服务器将其加载,实现了不同动态库处于多种系统环境下也能被主程序调用的目的。
总之,以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
权利要求
1.一种调用动态库的方法,其特征在于,包括主程序向动态库服务器发送调用动态库中函数的请求消息,所述请求消息中携带有调用函数的参量;动态库服务器根据所述参量调用动态库中的函数,并在响应消息中向主程序返回函数执行结果。
2.根据权利要求1所述的调用动态库的方法,其特征在于,该方法还进一步包括以下步骤动态库服务器在启动时加载所述动态库服务器自身管理的动态库,并根据主程序的请求,向主程序返回加载成功的动态库列表。
3.根据权利要求2所述的调用动态库的方法,其特征在于,所述动态库服务器在加载自身管理的动态库时,将多个具有先后调用关系的函数调用设置于同一会话组中,对于隶属于同一会话组的多个调用,只发送给同一动态库服务器。
4.根据权利要求1所述的调用动态库的方法,其特征在于,所述携带的参量包括动态库名、函数名及该函数的参数列表。
5.根据权利要求1至5中任意一项所述的调用动态库的方法,其特征在于,所述向主程序返回函数执行结果进一步包括动态库服务器将函数执行的输出参数通过所述响应消息返回给主程序。
6.根据权利要求5所述的调用动态库的方法,其特征在于,在所述请求消息及所述响应消息中携带的函数返回值及参数使用网络字节序,当所述主程序或动态库服务器使用非网络字节序时,则将所述函数返回值及参数转换为网络字节序。
7.根据权利要求6所述的调用动态库的方法,其特征在于,所述将所述函数返回值及参数转换为网络字节序包括以下步骤所述函数返回值及参数具有明确的参数类型,由动态库服务器或主程序的消息发送与接受机制完成本机字节序与网络字节序的转换;或所述返回值及参数不具有明确的参数类型,由动态库的使用者与动态库协商实现字节序的统一。
8.一种调用动态库的装置,其特征在于,包括主程序执行单元,用于发送请求消息调用动态库中的函数,所述请求消息中携带有调用函数的参量;动态库服务器,用于根据所述参量完成动态库单元中函数的调用,并在响应消息中向所述主程序执行单元返回函数的执行结果;动态库单元,用于根据所述动态库服务器的调用请求运行所述函数,并向动态库服务器上报执行结果。
9.根据权利要求8所述的调用动态库的装置,其特征在于,所述动态库服务器具体包括加载模块,用于在所述动态库服务器启动时将自身管理的动态库加载到本地;消息处理模块,用于接收所述主程序执行单元发送的请求消息,并根据消息中携带的动态库名、函数名及参数列表发送调用指令;将函数的执行结果及输出参数通过响应消息返回给所述主程序执行单元;调用模块,用于根据所述调用指令中的函数名及参数列表调用相应的函数,并将执行结果及返回参数上报给所述消息处理模块。
10.根据权利要求8或9所述的调用动态库的装置,其特征在于,所述主程序执行单元调用一个或一个以上的动态库服务器,所述动态库服务器管理一个或一个以上的动态库单元。
11.根据权利要求8或9所述的调用动态库的装置,其特征在于,所述动态库服务器与动态库设置于同一台计算机上。
12.一种动态库服务器,其特征在于,包括加载模块,用于在启动时将自身管理的动态库加载到本地;消息处理模块,用于接收主程序发送的携带有调用函数的参量的请求消息,并根据所述参量发送调用指令;将执行结果通过响应消息返回给主程序;调用模块,用于根据所述调用指令中的函数名及参数列表调用对应的函数,并将函数的执行结果上报给所述消息处理模块。
全文摘要
本发明实施例公开了一种调用动态库的方法,包括主程序向动态库服务器发送调用动态库中函数的请求消息,所述请求消息中携带有调用函数的参量;动态库服务器根据所述参量调用动态库中的函数,并在响应消息中向主程序返回函数执行结果。本发明实施例还公开了一种调用动态库的装置,包括主程序执行单元,用于发送请求消息调用动态库中的函数;动态库服务器,用于根据请求消息中携带的参量完成动态库单元中函数的调用,并在响应消息中向主程序执行单元返回函数执行结果;动态库单元,用于根据动态库服务器的调用请求运行函数,并上报函数执行结果。本发明实施例还公开了一种动态库服务器。本发明提高了主程序的稳定性和动态库的可移植性。
文档编号G06F9/48GK101021804SQ20071008675
公开日2007年8月22日 申请日期2007年3月13日 优先权日2007年3月13日
发明者梁震, 谢春风, 邓庆锋, 汪竞, 骆卫宝, 柯小川, 刘陈明 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1