构件化软件系统实现脚本语言调用多输出参数接口的方法

文档序号:6613449阅读:149来源:国知局
专利名称:构件化软件系统实现脚本语言调用多输出参数接口的方法
技术领域
本发明涉及计算机软件领域,特别涉及构件化软件系统技术领域,具体是指一种构件化 软件系统中实现脚本语言调用多输出参数接口的方法。
背景技术
随着计算机软件技术的不断发展,出现了各种先进的嵌入式操作系统,而且在这些嵌入 式操作系统上所形成的CAR (Component Assembly Runtime)技术提供了一种构件化软件开 发的便捷方案。该技术是基于<:"++的二进制构件技术,主要应用于嵌入式设备上。
一个CAR构件库在一般情况下是一个动态链接库(Dynamic Link Library)文件,其包含 有若干CAR对象以及CAR构件相关的元信息, 一个CAR对象通过暴露若干接口来提供服 务。生成一个CAR构件库首先需要提供一个CAR构件接口定义文件(.car文件)。该文件的
一个说明性示例如下
module {
interface IFooBar { Foo ( Int32 num, [in] AString string, [out] Int32 * pNum, [out] AStringBuf—<128> strbuf) Bar ( — [in] Int32 num)
}
class CFooBar { interface IFooBar,'
在上例中,module关键字定义一个构件库模块,interface关鍵字定义一个接口 , class关 键字定义一个类。Foo和Bar是用户定义的接口的方法。接口方法中的参数除了要声明类型 (比如Int32、 AString等)还要声明是输入(in)还是输出(out)参数。 一个输出参数本质 上是某种数据类型的指针。
利用嵌入式操作系统平台SDK提供的工具编译这个定义文件,将生成一系列框架文件。 这些文件提供了将要实现的类的框架和空实现,为用户真正实现这些接口功能提供了方便。 在这些文件中需要用户提供实现的有CFooBar.h和CFooBar.cpp。这两个文件的内容类似如下
所示
#ifndef —CFOOBAR—H— #define 二 CFOOBa5 J— #include "_CFooBai:,h" CarClass(CFooBar)
public:
CARAPI Foo(
/* [in] */ Int32 num,
/* [in] */ AString string,
/* [out] V Int32 * pPNum,
/★ [out] */ AStringBuf * pStrbuf)
CARAPI Bar(
/★ [in] V Int32 num, )
#endif // —CFOOBAR_H—
弁include "CFooBar,h" #include "—CFooBar.cpp"
ECode CFooBar z:Foo(
/* [in] */ Int32 num,
/* [in] */ AString string,
/★ [out] ★/ Int32 * pPNum,
/* [out] */ AStringBuf * pStrbuf)
〃 TODO- Add your code here return E NOT IMPLEMENTED''
ECode CFooBar::Bar(
/* [in] V Int32 num)
// TODO- Add your code here return E一NOT一IMPLEMENTED'. } ——
当用户实现了该CAR构件所定义的功能之后,可以通过如下0++代码来使用该CAR构 件所提供的服务
〃创建CFooBar类的对象Obj Int32 num,'
AStringBuf—<128> abuf,-
Obj->Foo (l53, "Hello!", &num, &abuf)
Obj-〉Bar (456)
但是在这些嵌入式操作系统平台上CAR构件不但可以由0++代码来使用,还可以由脚本 (比如Lua脚本和JavaScript脚本)来使用。
Lua是一种扩展编程语言,用于支持一般的面向过程的编程,并具有数据描述能力。它 也对面向对象编程、功能编程(functional programming)和数据驱动编程(data-driven programming)提供了良好的支持。Lua试图被用作一门强大的轻量Mp本语言,对那些需要 一个这样的脚本的程序来说,Lua是一个用标准C实现的库。
作为一个脚本语言,Lua没有类似C的main函数,它只能被嵌入到一个宿主客户端(host client),称作嵌入程序(embedding program)或者简称宿主(host)。宿主程序可以调用函数 以执行一段Lua代码,或者读写Lua脚本变量,还可以注册一个C函数以被Lua脚本调用。 通过使用C函数,Lua可以处理非常广泛的领域里的问题。
关于Lua脚本语言的具体技术细节信息,请参考以下文献
"Programming in Lua》,http:〃www.lua.org/pil/
《Lua5.1开发手册》,http:〃www.lua.org/manual/5.1/
作为Lua脚本语言,可以通过如下方式来调用Foo方法
--创建CFooBar类的对象Obj Obj :Bar (456)
但是脚本如何调用Foo方法?在脚本语言里并没有指针的概念,不可能取变量的地址作 参数传入被调函数,那么如何得到out类型的参数值,已经成为摆在众多计算机软件开发人
员面前的迫切需要解决的问题。

发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种能够有效解决脚本语言调用构 件接口方法时输出参数返回值问题、实现过程简单、执行效率较高、使用方便快捷、工作性 能稳定可靠、适用范围较为广泛的构件化软件系统中实现脚本语言调用多输出参数接口的方 法。
为了实现上述的目的,本发明的构件化软件系统中实现脚本语言调用多输出参数接口的
方法如下
该构件化软件系统中实现脚本语言调用多输出参数接口的方法,其主要特点是,所述的 方法包括以下步骤
(1) 系统进行初始化操作;
(2) 系统才艮据用户操作,产生脚本语言对组件对象接口方法的调用语句;
(3) 系统中的脚本引擎读取所述的调用语句中的调用信息;
(4) 脚本引擎根据被调用的组件对象中的接口方法的元信息,将调用语句中调用信息传 递给该接口方法;
(5 )脚本引擎根据所述的被调用的组件对象中的接口方法的元信息判断该接口方法中是 否含有输出参数;
(6)如果该接口方法中含有输出参数,则脚本引擎进行输出参数变量动态生成并传入该 接口方法的操作处理;
(7) 脚本引擎调用该被调用的組件对象中的接口方法;
(8) 如果该接口方法中含有输出参数,则脚本引擎将输出参数变量转换为与脚本数据类 型相适配的输出信息,并将该输出信息返回给系统;
(9) 系统才艮据脚本引擎所返回的输出信息继续后续操作。
该构件化软件系统中实现脚本语言调用多输出参数接口的方法中的调用语句中的调用信 息包括组件对象接口方法名称和输入参数信息。
该构件化软件系统中实现脚本语言调用多输出参数接口的方法中的组件对象中的接口方 法的元信息包括各个参数的名称、类型、输入输出属性以及各个参数在参数列表中的顺序。
该构件化软件系统中实现脚本语言调用多输出参数接口的方法中的将调用语句中调用信 息传递给该接口方法,具体为
脚本引擎根据被调用的组件对象中的接口方法中的各个参数的信息,按顺序将调用语句 中的输入M信息依次传递给被调用的组件对象中的接口方法中所对应的输入参数。
该构件化软件系统中实现脚本语言调用多输出参数接口的方法中的脚本引擎进行输出参 数变量动态生成并传入该接口方法的操作处理,包括以下步骤
(61) 脚本引擎根据被调用的组件对象中的接口方法中各个输出参数的指针的类型在系 统中生成对应的输出参数变量,并为各个输出参数变量动态分配相应的内存空间,;
(62) 把所述的内存空间的地址传递给所述的被调用的组件对象中的接口方法中相应的 输出参数。
该构件化软件系统中实现脚本语言调用多输出参数接口的方法中的脚本引擎将输出参数 变量转换为与脚本数据类型相适配的输出信息并将该输出信息返回给系统,包括以下步骤
(81) 脚本引擎判断所述的脚本语言是否支持多返回值;
(82) 如果是,则将各个输出参数变量的内存空间中所存储的数据对象转换为与脚本语 言的数据类型相适配的多个返回值,并将该多个返回值创建至脚本中;
(83) 如果否,则将各个输出参数变量的内存空间中所存储的数据对象合并为与脚本语 言的数据类型相适配的单一返回值,并将该单一返回值创建至脚本中。
该构件化软件系统中实现脚本语言调用多输出参数接口的方法中的将各个输出参数变量 的内存空间中所存储的数据对象合并为单一返回值,具体为
脚本引擎将所有的输出参数变量合并成为一个"键-值"对的集合,其中"鍵"为该输出参 数变量在被调用的组件对象中的接口方法中所对应的输出参数名称,"值"为该输出参数变量 的内存空间中所存储的数据对象。
釆用了该发明的构件化软件系统中实现脚本语言调用多输出参数接口的方法,由于系统 中的脚本引擎能够自动根据脚本语言的调用信息、所调用的组件对象中的接口方法的输出参 数信息以及该脚本语言所支持的返回值的情况,能够动态生成输出参数变量,并将其传入该 接口方法中,并在调用完成后将输出M变量转换为与该脚本语言的数据类型相适配的输出 信息,并将该输出信息返回给系统,从而有效解决了脚本语言调用构件接口方法时输出参数 返回值的适配问题,不仅实现过程简单,而且代码的执行效率较高,使用方便快捷,同时工 作性能稳定可靠,适用范围较为广泛,为现代构件化软件系统的功能的进一步扩展和普及应 用奠定了坚实的基础。


图1为本发明的构件化软件系统实现脚本语言调用多输出参数接口的方法的流程图。
具体实施例方式
为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。
请参阅图l所示,该构件化软件系统中实现脚本语言调用多输出参数接口的方法,包括 以下步骤
(1) 系统进行初始化操作;
(2) 系统根据用户操作,产生脚本语言对组件对象接口方法的调用语句;
(3) 系统中的脚本引擎读取所述的调用语句中的调用信息;该调用语句中的调用信息包 括组件对象接口方法名称和输入参数信息;
(4) 脚本引擎根据被调用的组件对象中的接口方法的元信息,将调用语句中调用信息传 递给该接口方法;
其中,该组件对象中的接口方法的元信息包括各个参数的名称、类型、输入输出属性以 及各个参数在W:列表中的顺序;
将调用语句中调用信息传递给该接口方法,具体为
脚本引擎根据被调用的组件对象中的接口方法中的各个参数的信息,按顺序将调用语 句中的输入参数信息依次传递给被调用的组件对象中的接口方法中所对应的输入参 数;
(5 )脚本引擎根据所述的被调用的组件对象中的接口方法的元信息判断该接口方法中是 否含有输出^lst;
(6)如果该接口方法中含有输出参数,则脚本引擎进行输出参数变量动态生成并传入该
接口方法的操作处理,包括以下步骤
(a) 脚本引擎根据被调用的组件对象中的接口方法中各个输出参数的指针的类型在 系统中生成对应的输出参数变量,并为各个输出参数变量动态分配相应的内存空间,;
(b) 把所述的内存空间的地址传递给所述的被调用的组件对象中的接口方法中相应 的输出参数;
(7) 脚本引擎调用该被调用的组件对象中的接口方法;
(8) 如果该接口方法中含有输出参数,则脚本引擎将输出参数变量转换为与脚本数据类 型相适配的输出信息,并将该输出信息返回给系统,包括以下步骤
(a) 脚本引擎判断所述的脚本语言是否支持多返回值;
(b) 如果是,则将各个输出参数变量的内存空间中所存储的数据对象转换为与脚本 语言的数据类型相适配的多个返回值,并将该多个返回值创建至脚本中;
(c) 如果否,则将各个输出参数变量的内存空间中所存储的数据对象合并为与脚本 语言的数据类型相适配的单一返回值,并将该单一返回值创建至脚本中,具体为
脚本引擎将所有的输出参数变量合并成为一个"鍵-值"对的集合,其中"键"为该 输出参数变量在被调用的组件对象中的接口方法中所对应的输出参数名称,"值,, 为该输出参数变量的内存空间中所存储的数据对象;
(9) 系统才艮据脚本引擎所返回的输出信息继续后续操作。
在实际使用当中,本发明的方法的基本思路是把out类型的参数值作为返回值返回给脚 本;对于有一个以上out参数的方法,根据脚本语言的不同做不同处理当所用脚本语言(比 如JavaScript)的函数调用只能有一个返回值时,返回一个联合数组;当所用脚本语言(比如 Lua)的函数调用可以返回多个返回值时,把所有的out类型参数的值作为函数返回值返回。
下面将举例说明。
假如有如下规格的接口方法 Foo ( I'nt32' n, AString string, Int32 ★ num, AStringBuf—<128> strbuf)
脚本针对此方法做出了如下调用(假设是JavaScript脚本)
Obj ,Foo(123, 、、hello"),' 那么根据接口方法Foo的元信息,它有2个in参数,2个out参数。则123和"hello"会
分别传递给该接口方法的前两个形式参数;num和strbuf是out参数,根据它们的元信息,则
分别生成一个Int32类型的变量和一个128字节的緩存,并把它们的地址分别传递给后两个形式参数;然后调用真正的接口方法。在方法成功返回之后,out参数对应的变量会被转换成脚
本类型的整数和字符串,返回到脚本中去。
在上面的例子中,脚本并没有接收后两个out参数。如果脚本想要接收这些out参数,根
据脚本的不同类型,可以有不同的选择。比如,对JavaScript这样的脚本,函数调用只能返
回一个返回值。则可以把所有的out参数存放在一个联合数组里返回给脚本,也就是说,返
回值ret是一个联合数组,即一个"鍵-值"对的集合,脚本可以通过在CAR定义文件中定义的
out参数的名字来查找该参数的返回值。然后脚^f艮据out参数的名字访问相应的值
//创建CFooBar类的对象Obj
var ret = Obj.Foo(123, 、、hello")
print (ret.pNum)
print (ret. strbuf)
对于可以接收多个返回值的脚本(比如Lua)来说,可以直接把out参数作为返回值返回
--创建CFooBar类的对象Obj
local num, str = Obj:Foo(123, "hello"),.
print (num)
print (str)
因为Lua函数调用可以返回多个返回值,所以可以直接把out参数作返回值返回给多个 脚本变量。
脚本用户只需要按照以上所示的语法来调用CAR对象的方法即可,对out参数的处理由 执行脚本的脚本引擎负责。如下的过程是由脚本引擎完成的,对脚本用户来讲是透明的,
当脚本调用CAR对象Obj上的Foo方法,并传入参数123、 "hello"时,脚本引擎首先取 得Foo方法的有关元数据(包含在CAR构件库内),包括Foo方法的所有参数名称、类型以 及in、 out属性,还有它们在参数列表里的顺序。对于in参数,脚本引擎把脚本所传入的参 数依次传递给被调函数的相应的in参数。比如,对脚本调用Foo(123, "hello")来说,123被 传递给了形式参数num, "hello"被传递给了 string。对于out参数,脚本引擎根据需要和指针 的类型动态分配一块内存,然后把这块内存的地址传给被调函数的相应的out参数;在实际 的函数调用完成时,再把这块内存所表示的数据对象通过脚本函数返回值的形式创建到脚本 中去。
比如,对脚本调用Foq(I23, "hello")来说,脚本引擎发现CAR构件元信息中定义的Foo 的第二、四个^:是out类型,且一个是32位整型的指针, 一个是指向长128字节的字符串 的指针,因此脚本引擎就动态分配两块相应大小的内存,并把地址传递给形式参数pNum和 strbuf。最后,所有参数传递完毕,脚本引擎发起实际的函数调用;然后引擎把与out参数相 关的整数和字符串转化成脚本的整数和字符串,并作为脚本调用的返回值返回。
在脚本引擎向脚本返回所有这些out参数的时候,不同的类型的引擎将做不同的处理 *像JavaScript这样脚本函数只能返回一个值的脚本,引擎将把所有的out参数值打包
成一个"键-值"对的集合,"键"的名称就是该参数在CAR构件接口定义文件中声明
的参数名,值就是实际调用的CAR函数返回的值; *对于Lua这样脚本函数可以返回多个值的脚本来说,引擎将把这些out值作为脚本函
数返回值依次返回。
釆用了上述的构件化软件系统中实现脚本语言调用多输出参数接口的方法,由于系统中 的脚本引擎能够自动根据脚本语言的调用信息、所调用的组件对象中的接口方法的输出参数 信息以及该脚本语言所支持的返回值的情况,能够动态生成输出参数变量,并将其传入该接 口方法中,并在调用完成后将输出参数变量转换为与该脚本语言的数据类型相适配的输出信 息,并将该输出信息返回给系统,从而有效解决了脚本语言调用构件接口方法时输出参数返 回值的适配问题,不仅实现过程简单,而且代码的执行效率较高,使用方便快捷,同时工作 性能稳定可靠,适用范围较为广泛,为现代构件化软件系统的功能的进一步扩展和普及应用 奠定了坚实的M。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种 修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限 制性的。
权利要求
1、一种构件化软件系统中实现脚本语言调用多输出参数接口的方法,其特征在于,所述的方法包括以下步骤(1)系统进行初始化操作;(2)系统根据用户操作,产生脚本语言对组件对象接口方法的调用语句;(3)系统中的脚本引擎读取所述的调用语句中的调用信息;(4)脚本引擎根据被调用的组件对象中的接口方法的元信息,将调用语句中调用信息传递给该接口方法;(5)脚本引擎根据所述的被调用的组件对象中的接口方法的元信息判断该接口方法中是否含有输出参数;(6)如果该接口方法中含有输出参数,则脚本引擎进行输出参数变量动态生成并传入该接口方法的操作处理;(7)脚本引擎调用该被调用的组件对象中的接口方法;(8)如果该接口方法中含有输出参数,则脚本引擎将输出参数变量转换为与脚本数据类型相适配的输出信息,并将该输出信息返回给系统;(9)系统根据脚本引擎所返回的输出信息继续后续操作。
2、 根据权利要求1所述的构件化软件系统中实现脚本语言调用多输出参数接口的方法, 其特征在于,所述的调用语句中的调用信息包括组件对象接口方法名称和输入参数信息。
3、 根据权利要求2所述的构件化软件系统中实现脚本语言调用多输出参数接口的方法, 其特征在于,所述的组件对象中的接口方法的元信息包括各个参数的名称、类型、输入输出 属性以及各个^在参数列表中的顺序。
4、 4MI权利要求3所述的构件化软件系统中实现脚本语言调用多输出参数接口的方法, 其特征在于,所述的将调用语句中调用信息传递给该接口方法,具体为脚本引擎根据被调用的组件对象中的接口方法中的各个参数的信息,按顺序将调用语句 中的输入参数信息依次传递给被调用的组件对象中的接口方法中所对应的输入参数。
5、 根据权利要求4所述的构件化软件系统中实现脚本语言调用多输出M接口的方法, 其特征在于,所述的脚本引擎进行输出参数变量动态生成并传入该接口方法的操作处理,包 括以下步骤(61)脚本引擎根据被调用的组件对象中的楱口方法中各个输出参数的指针的类型在系统中生成对应的输出参数变量,并为各个输出#变量动态分配相应的内存空间,;(62)把所述的内存空间的地址传递给所述的被调用的组件对象中的接口方法中相应的 输出参数。
6、 根据权利要求5所述的构件化软件系统中实现脚本语言调用多输出参数接口的方法, 其特征在于,所述的脚本引擎将输出参数变量转换为与脚本数据类型相适配的输出信息并将 该输出信息返回给系统,包括以下步骤(81) 脚本引擎判断所述的脚本语言是否支持多返回值;(82) 如果是,则将各个输出参数变量的内存空间中所存储的数据对象转换为与脚本语 言的数据类型相适配的多个返回值,并将该多个返回值创建至脚本中;(83) 如果否,则将各个输出参数变量的内存空间中所存储的数据对象合并为与脚本语 言的数据类型相适配的单一返回值,并将该单一返回值创建至脚本中。
7、 根据权利要求6所述的构件化软件系统中实现脚本语言调用多输出参数接口的方法, 其特征在于,所述的将各个输出参数变量的内存空间中所存储的数据对象合并为单一返回值, 具体为脚本引擎将所有的输出参数变量合并成为一个"键-值"对的集合,其中"键"为该输出参 数变量在被调用的组件对象中的接口方法中所对应的输出参数名称,"值"为该输出参数变量 的内存空间中所存储的数据对象。
全文摘要
本发明涉及一种构件化软件系统中实现脚本语言调用多输出参数接口的方法,包括系统产生脚本语言对组件对象接口方法的调用语句、脚本引擎读取调用信息、脚本引擎根据接口方法的元信息将调用信息传递给接口方法、脚本引擎判断接口方法中是否含有输出参数、如果有则进行输出参数变量动态生成并传入该接口方法的操作处理、脚本引擎调用该接口方法、脚本引擎将输出参数变量转换为与脚本数据类型相适配的输出信息并返回给系统。采用该种构件化软件系统中实现脚本语言调用多输出参数接口的方法,有效解决了脚本语言调用构件接口方法时输出参数返回值的适配问题,实现过程简单,代码执行效率较高,使用方便快捷,同时工作性能稳定可靠,适用范围较为广泛。
文档编号G06F9/44GK101196812SQ20071017232
公开日2008年6月11日 申请日期2007年12月14日 优先权日2007年12月14日
发明者雷 张, 牛靖宇, 胡建平 申请人:上海科泰世纪科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1