CN102662739B - 实现函数调用的方法和装置 - Google Patents
实现函数调用的方法和装置 Download PDFInfo
- Publication number
- CN102662739B CN102662739B CN201210079327.3A CN201210079327A CN102662739B CN 102662739 B CN102662739 B CN 102662739B CN 201210079327 A CN201210079327 A CN 201210079327A CN 102662739 B CN102662739 B CN 102662739B
- Authority
- CN
- China
- Prior art keywords
- call
- function
- actuators
- shared drive
- unique identification
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 27
- 230000008569 process Effects 0.000 claims description 12
- 238000004891 communication Methods 0.000 description 6
- 230000005540 biological transmission Effects 0.000 description 5
- 238000012423 maintenance Methods 0.000 description 5
- 230000008859 change Effects 0.000 description 3
- 230000008676 import Effects 0.000 description 2
- 230000001360 synchronised effect Effects 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
Landscapes
- Communication Control (AREA)
Abstract
本发明揭示了一种实现函数调用的方法和装置,该方法包括步骤:64位转换器收到调用函数的函数调用请求时,向已启动的32位执行器传递该调用函数的唯一标识和参数;所述32位执行器根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器,供所述64位转换器将调用结果反馈给所述调用函数。本发明提供的一种实现函数调用的方法和装置,解决了现有技术中间件存在的代码冗余、体积大和维护工作量大的问题。
Description
技术领域
本发明涉及到中间件运用开发技术领域,尤其涉及到一种实现函数调用的方法和装置。
背景技术
现有的64位操作系统,一般同时支持64位和32位应用程序的运行,但是这两类应用程序是“隔离”的,即64位程序只能加载64位的动态链接库,32位程序则只能加载32位的动态链接库。如图1所示,假设硬件提供商需要提供的中间件动态链接库名字为csp.dll,该库可用于导出一些函数供第三方调用。现有技术需要同时提供csp_64.dll和csp_32.dll(csp_64.dll表示64位动态链接库文件,csp_32.dll表示32位动态链接库文件),64位的调用者caller_64.exe调用csp_64.dll,32位的调用者caller_32.exe调用csp_32.dll。硬件提供商为了在64为操作系统上同时支持32位和64位程序的调用,需要在中间件中同时提供32位和64位的动态链接库文件,而两套库文件在功能和结构上具有很大的相似性,造成代码的冗余。
此外,这种中间件整体的体积大,如果中间件需要写入到FLASH中,文件大会增加硬件的成本,其中成本的增加在PC或笔记本电脑等相对大型的设备中对整体成本的影响并不突出,但是在如智能密钥装置等相对小型的移动终端设备中则影响很大,而且容量大的存储芯片的体积也会大,也不利于移动终端的小型化设计;而且,64位和32位中间件在使用中都可能出现问题,硬件提供商需要解决2套库文件的维护和升级问题,工作量会增大。
发明内容
本发明的主要目的为提供一种实现函数调用的方法和装置,解决了现有技术中间件存在的代码冗余、体积大和维护工作量大的问题。
本发明提出一种实现函数调用的方法,包括步骤:
64位转换器收到调用函数的函数调用请求时,向已启动的32位执行器传递该调用函数的唯一标识和参数;
所述32位执行器根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器,供所述64位转换器将调用结果反馈给所述调用函数。
优选地,所述64位转换器收到调用函数的函数调用请求时,向已启动的32位执行器传递该调用函数的唯一标识和参数包括:
所述64位转换器通过轮询、网络端口通讯、发送消息或共享内存传递所述唯一标识和参数。
优选地,在执行所述32位执行器根据唯一标识和参数调用32位动态链接库文件完成函数调用请求之前,还包括:
所述64位转换器通过轮询、共享内存、发送消息或一个事件内核对象,通知所述32位执行器处理所述函数调用请求。
优选地,在执行所述64位转换器收到调用函数的函数调用请求时,向已启动的32位执行器传递该调用函数的唯一标识和参数之前,还包括:
判断所述32位执行器是否启动;
当所述32位执行器没有启动时,启动所述32位执行器。
本发明还提出一种实现函数调用的装置,包括64位转换器和32位执行器,其中,
64位转换器,用于收到调用函数的函数调用请求时,向已启动的所述32位执行器传递该调用函数的唯一标识和参数;
所述32位执行器,用于根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器,供所述64位转换器将调用结果反馈给所述调用函数。
优选地,所述64位转换器具体用于:通过网络端口通讯、发送消息或共享内存传递所述唯一标识和参数。
优选地,所述64位转换器还用于:通过轮询、共享内存、发送消息或一个事件内核对象,通知所述32位执行器处理所述函数调用请求。
优选地,所述64位转换器还用于:判断所述32位执行器是否启动;以及当所述32位执行器没有启动时,启动所述32位执行器。
本发明通过64位转换器和32位执行器,分别调用转换文件和可执行文件,从而只需要提供32位动态链接库文件即可同时支持64位和32位应用程序的运行。由于转换文件和可执行文件的功能都比较简单,只需要完成调用转换,代码量不大,这两个文件的大小加起来依然比64位动态链接库文件要小很多,所以从整体上压缩了中间件的代码,解决了代码的冗余、整体体积过大和2套库文件引起的维护和升级工作量大的问题。
附图说明
图1为现有技术中中间件的结构示意图;
图2为本发明实现函数调用的方法一实施例的流程示意图;
图3为本发明实现函数调用的方法一实施例中信息传递示意图;
图4为本发明实现函数调用的装置一实施例的结构示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参照图2,提出本发明实现函数调用的方法一实施例,本实施例在任一同时支持64位和32位应用程序的装置内设置一64位转换器和一32位执行器,该64位转换器可接收64位应用程序的调用请求,并将该调用的相关信息传递给32位执行器,由32位执行器加载32位动态链接库文件执行上述调用请求,并返回调用结果。
本实施例具体包括步骤:
S301:64位转换器收到64位的调用函数如导出函数Fun1的函数调用请求,调用一转换文件(本实施例假设该转换文件名为CspShellDll_64.dll)创建一共享内存,并启动32位执行器处理该调用请求;
具体的,参照图3,64位转换器收到64位的调用函数的函数调用请求,需要通过调用CspShellDll_64.dll将该函数调用请求交由32位执行器完成。首先,CspShellDll_64.dll需要将上述函数调用请求及调用函数的相关信息传递给32位执行器,传递的方式有轮询、网络端口通讯、发送消息或共享内存等多种方式,本实施例优选共享内存的方式。CspShellDll_64.dll创建一块共享内存,该共享内存用于写入该调用函数的信息以供32位执行器读取,并且检查32位执行器是否已经启动,如果没有启动,则启动32位执行器,使其进入循环等待状态,等待64位转换器触发的调用事件。
S302:64位转换器向共享内存中写入调用函数的信息;
具体的,64位转换器调用CspShellDll_64.dll向该共享内存中写入该调用函数的唯一标识(中间件给每个导出函数分配的一个整数,称为ID,用来唯一标识导出函数)和其参数,供32位执行器读取。
S303:64位转换器通过一个事件内核对象,通知32位执行器处理该函数调用请求,之后等待32位执行器完成此次调用;
具体的,64位转换器调用CspShellDll_64.dll,CspShellDll_64.dll在将上述函数调用请求的信息写入上述共享内存后,通过一个事件内核对象,通知32位执行器有一个函数调用需要处理,之后等待32位执行器完成此次调用。所述事件内核对象是最基本的内核对象,包含一个使用计数(与所有内核对象一样),一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。64位转换器还可通过轮询、共享内存或发送消息的方式等本领域技术人员可以想到的方式通知32位执行器。
S304:32位执行器从共享内存中读取调用函数的信息后,根据该信息调用32位动态链接库文件(本实施例假设该32位动态链接库文件名为csp_32.dll)完成该函数调用请求,得到调用结果;
具体的,32位执行器在收到64位转换器的调用事件通知后,结束循环等待状态,调用一可执行文件(本实施例假设该可执行文件名为CspShellExe_32.exe)从上述共享内存中读取被调用函数的ID,根据该函数的ID调用csp_32.dll中相应的函数,之后从上述共享内存中读取该函数的参数导入所述csp_32.dll中相应的函数中,得到调用结果。
S305:32位执行器将调用结果写入共享内存,然后通过设置调用完成事件通知64位转换器此次调用已经完成;
具体的,32位执行器调用CspShellExe_32.exe,CspShellExe_32.exe将调用结果写入上述共享内存,之后通过设置调用完成事件通知64位转换器此次调用已经完成,可以读取该调用结果。32位执行器将调用结果传递给64位转换器的方式同样有轮询、网络端口通讯、发送消息或共享内存等多种方式,本实施例优选共享内存的方式。
S306:64位转换器收到通知,结束等待,从共享内存中读取调用结果,反馈给64位的调用函数;
具体的,64位转换器收到调用完成的通知,结束等待。同样,32位执行器也可通过轮询、共享内存、事件内核对象或发送消息的方式等本领域技术人员可以想到的方式通知64位转换器。
CspShellDll_64.dll从共享内存中读取调用结果,反馈给64位的调用者,至此,整个函数调用过程结束。
本实施例中实现函数调用的方法,64位转换器和32位执行器通过共享内存来传递调用信息以及返回调用结果,使用事件内核对象来同步,最终实现将对64位动态链接库中导出函数的调用转向到对32位动态链接库的导出函数的调用,与现有技术相比,省掉了64位动态链接库文件。CspShellDll_64.dll和CspShellExe_32.exe的功能都比较简单,只需要完成调用转换,代码量不大,这两个文件的大小加起来依然比64位动态链接库文件要小很多,所以从整体上压缩了中间件的代码,解决了代码的冗余,整体体积过大和2套库文件引起的维护和升级工作量大的问题。
参照图4,提出本发明实现函数调用的装置一实施例,包括:
64位转换器10,用于收到调用函数的函数调用请求时,向已启动的所述32位执行器20传递该调用函数的唯一标识和参数;
32位执行器20,用于根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器10,供所述64位转换器10将调用结果反馈给所述调用函数。
本实施例的装置,可以设置或集成于任一同时支持64位和32位应用程序的装置如某一PC的CPU内。
其中,64位转换器10可调用转换文件(本实施例假设该转换文件名为CspShellDll_64.dll),32位执行器20可调用可执行文件(本实施例假设该可执行文件名为CspShellExe_32.exe)。CspShellDll64.dll需要导出与32位动态链接库文件(本实施例假设该32位动态链接库文件名为csp32.dll)同样的导出函数。64位转换器10首次调用CspShellDll64.dll的某个导出函数时,CspShellDll64.dll启动32位执行器20,由32位执行器20调用CspShellExe32.exe,该进程会加载csp_32.dll,最终将对64位动态链接库文件导出函数的调用会转向到对csp32.dll的导出函数的调用。
具体地,本实施例的装置工作原理如下:
参照图3,64位转换器10收到64位的调用函数的函数调用请求,需要通过调用CspShellDll_64.dll将该函数调用请求交由32位执行器20完成。首先,CspShellDll_64.dll需要将上述函数调用请求及调用函数的相关信息传递给32位执行器20,传递的方式有轮询、网络端口通讯、发送消息或共享内存等多种方式,本实施例优选共享内存的方式。CspShellDll_64.dll创建一块共享内存,该共享内存用于写入该调用函数的信息以供32位执行器20读取,并且检查32位执行器20是否已经启动,如果没有启动,则启动32位执行器20,使其进入循环等待状态,等待64位转换器10触发的调用事件。
64位转换器10调用CspShellDll_64.dll向该共享内存中写入该调用函数的唯一标识(中间件给每个导出函数分配的一个整数,称为ID,用来唯一标识导出函数)和其参数,供32位执行器20读取。
64位转换器10调用CspShellDll_64.dll,CspShellDll_64.dll在将上述函数调用请求的信息写入上述共享内存后,通过一个事件内核对象,通知32位执行器20有一个函数调用需要处理,之后等待32位执行器20完成此次调用。64位转换器10还可通过轮询、共享内存或发送消息的方式等本领域技术人员可以想到的方式通知32位执行器20。
32位执行器20在收到64位转换器10的调用事件通知后,结束循环等待状态,调用CspShellExe_32.exe从上述共享内存中读取被调用函数的ID,根据该函数的ID调用csp_32.dll中相应的函数,之后从上述共享内存中读取该函数的参数导入所述csp_32.dll中相应的函数中,得到调用结果。
32位执行器20调用CspShellExe_32.exe,CspShellExe_32.exe将调用结果写入上述共享内存,32位执行器20将调用结果传递给64位转换器10的方式同样有轮询、网络端口通讯、发送消息或共享内存等多种方式,本实施例优选共享内存的方式。之后通过设置调用完成事件通知64位转换器10此次调用已经完成,可以读取该调用结果。同样,32位执行器20也可通过轮询、共享内存、事件内核对象或发送消息的方式等本领域技术人员可以想到的方式通知64位转换器10。
64位转换器10收到通知,结束等待,调用CspShellDll_64.dll从共享内存中读取调用结果,反馈给64位的调用者,至此,整个函数调用过程结束。
本实施例中实现函数调用的装置,64位转换器10和32位执行器20通过共享内存来传递调用信息以及返回调用结果,使用事件内核对象来同步,最终实现将对64位动态链接库中导出函数的调用转向到对32位动态链接库的导出函数的调用,与现有技术相比,省掉了64位动态链接库文件。CspShellDll_64.dll和CspShellExe_32.exe的功能都比较简单,只需要完成调用转换,代码量不大,这两个文件的大小加起来依然比64位动态链接库文件要小很多,所以从整体上压缩了中间件的代码,解决了代码的冗余,整体体积过大和2套库文件引起的维护和升级工作量大的问题。
以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (4)
1.一种实现函数调用的方法,其特征在于,包括步骤:
64位转换器收到调用函数的函数调用请求时,向已启动的32位执行器传递该调用函数的唯一标识和参数;
所述32位执行器根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器,供所述64位转换器将调用结果反馈给所述调用函数;
其中,所述64位转换器向已启动的32位执行器传递该调用函数的唯一标识和参数的方式为共享内存方式,所述共享内存方式的步骤包括:所述64位转换器调用一转换文件创建一共享内存,向该共享内存中写入该调用函数的唯一标识和参数,并通过一个事件内核对象通知所述32位执行器处理该函数调用请求;
其中,所述32位执行器根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器,供所述64位转换器将调用结果反馈给所述调用函数的步骤包括:所述32位执行器从该共享内存中读取该调用函数的唯一标识和参数后,根据该唯一标识和参数调用32位动态链接库文件完成该函数调用请求,得到调用结果;所述32位执行器将该调用结果写入该共享内存,然后通知所述64位转换器此次调用已经完成,以使得所述64位转换器从共享内存中读取该调用结果,反馈给该调用函数。
2.如权利要求1所述的方法,其特征在于,在执行所述64位转换器收到调用函数的函数调用请求时,向已启动的32位执行器传递该调用函数的唯一标识和参数之前,还包括:
判断32位执行器是否启动;
当32位执行器没有启动时,启动所述32位执行器。
3.一种实现函数调用的装置,其特征在于,包括64位转换器和32位执行器,其中,
64位转换器,用于收到调用函数的函数调用请求时,向已启动的所述32位执行器传递该调用函数的唯一标识和参数;
所述32位执行器,用于根据所述唯一标识和参数调用32位动态链接库文件完成所述函数调用请求,并将调用结果反馈给所述64位转换器,供所述64位转换器将调用结果反馈给所述调用函数;
其中:
所述64位转换器,用于收到调用函数的函数调用请求时,通过共享内存的方式向已启动的所述32位执行器传递该调用函数的唯一标识和参数,所述共享内存的方式的步骤包括:调用一转换文件创建一共享内存,向该共享内存中写入该调用函数的唯一标识和参数,并通过一个事件内核对象通知所述32位执行器处理该函数调用请求;
所述32位执行器,用于从该共享内存中读取该调用函数的唯一标识和参数后,根据该唯一标识和参数调用32位动态链接库文件完成该函数调用请求并得到调用结果,将该调用结果写入该共享内存后,通知所述64位转换器此次调用已经完成,以使得所述64位转换器从共享内存中读取该调用结果,反馈给该调用函数。
4.如权利要求3所述的装置,其特征在于,所述64位转换器还用于:判断所述32位执行器是否启动;以及当所述32位执行器没有启动时,启动所述32位执行器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210079327.3A CN102662739B (zh) | 2012-03-23 | 2012-03-23 | 实现函数调用的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210079327.3A CN102662739B (zh) | 2012-03-23 | 2012-03-23 | 实现函数调用的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102662739A CN102662739A (zh) | 2012-09-12 |
CN102662739B true CN102662739B (zh) | 2015-04-22 |
Family
ID=46772238
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210079327.3A Expired - Fee Related CN102662739B (zh) | 2012-03-23 | 2012-03-23 | 实现函数调用的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102662739B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105446732A (zh) * | 2015-05-13 | 2016-03-30 | 北京天诚盛业科技有限公司 | 64位程序的运行实现方法、装置和系统 |
CN111142969A (zh) * | 2019-12-27 | 2020-05-12 | 贵阳动视云科技有限公司 | 64位程序调用32位程序模块的方法、装置、介质及设备 |
CN112328932A (zh) * | 2020-07-30 | 2021-02-05 | 神州融安科技(北京)有限公司 | 操作执行方法、电子设备及计算机可读存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1991745A (zh) * | 2005-12-27 | 2007-07-04 | 英业达股份有限公司 | 在64位系统中利用32位主程序拦截64位信息的方法 |
CN101546278A (zh) * | 2009-05-07 | 2009-09-30 | 山东中创软件商用中间件股份有限公司 | 32位的程序与64位的驱动传输数据技术 |
-
2012
- 2012-03-23 CN CN201210079327.3A patent/CN102662739B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1991745A (zh) * | 2005-12-27 | 2007-07-04 | 英业达股份有限公司 | 在64位系统中利用32位主程序拦截64位信息的方法 |
CN101546278A (zh) * | 2009-05-07 | 2009-09-30 | 山东中创软件商用中间件股份有限公司 | 32位的程序与64位的驱动传输数据技术 |
Also Published As
Publication number | Publication date |
---|---|
CN102662739A (zh) | 2012-09-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8572578B2 (en) | Script debugging | |
WO2023284699A1 (zh) | 基于Linux系统的协议栈数据传输方法、计算机设备和存储介质 | |
CN100511156C (zh) | 强制性地终止输入/输出操作阻止的线程的设备和方法 | |
CN102567111A (zh) | 一种异步过程调用的方法、系统和终端设备 | |
CN102694866B (zh) | 一种分布式网络环境中的服务请求代理系统 | |
CN103425225A (zh) | 便携数据设备操作系统中的应用程序装置及其运行方法 | |
CN108733496B (zh) | 事件处理方法和装置 | |
KR20080040104A (ko) | Sca 기반 시스템의 애플리케이션 컴포넌트 통신 장치 및방법 | |
CN102662739B (zh) | 实现函数调用的方法和装置 | |
KR20140113662A (ko) | Hid i2c 데이터 버스를 위한 호스트 측 구현 기법 | |
EP2713269A1 (en) | Method for updating data card, personal computer and data card | |
TW201214127A (en) | Memory device, host controller and memory system | |
CN114328183A (zh) | 一种调试方法、装置、设备以及计算机可读存储介质 | |
TWI492153B (zh) | System platform for supporting infrared receiver / transmitter and method of operation thereof | |
CN102200770A (zh) | 一种基于pci的信息交互系统及方法、上位机 | |
CN101819524B (zh) | Rfid阅读器的访问方法及其接口驱动设备 | |
CN103412837A (zh) | 一种提高人机接口设备通讯稳定的方法、设备和系统 | |
CN103198257B (zh) | 在混合信息处理设备环境下的安全性重新使用 | |
CN105446732A (zh) | 64位程序的运行实现方法、装置和系统 | |
JP2017062540A (ja) | 片方向オペレーティングシステム間通信システム及びプログラム | |
CN112527535B (zh) | 一种基于原生WebView扩展应用的互动方法及终端 | |
CN109582633B (zh) | 一种pos机中双cpu的通讯方法 | |
CN102298446B (zh) | 一种多鼠标/键盘模拟装置 | |
CN102316073A (zh) | 服务器及利用该服务器实现uefi bios远程升级的方法 | |
CN101894031A (zh) | 普适服务的动态更新方法及其更新系统 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150422 |