返回值
From Apache OpenOffice Wiki
在 UNO 中,可以通过三种方法返回值:
- 函数返回值
-
inout
参数 -
out
参数
在大多数语言中,一般都可以返回值,但不一定支持 inout
和 out
参数,例如 JScript。
在 C++ 中要接收返回值,请向 IDispatch::Invoke
提供一个 VARIANT
参数:
//UNO IDL long func(); // DISPPARAMS dispparams= { NULL, 0, 0, 0}; VARIANT result; VariantInit( &result); hr= pdisp->Invoke( dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &result, NULL, 0);
以下示例显示使用 VB 和 JScript 时,获得返回值比较简单:
//VB Dim result As Long result= obj.func //JScript var result= obj.func
当函数具有 inout
参数时,请在 C++ 中以引用的方式提供参数:
//UNO IDL void func( [inout] long val); //C++ long longOut= 10; VARIANT var; VariantInit(&var); var.vt= VT_BYREF | VT_I4; var.plVal= &longOut; DISPPARAMS dispparams= { &var, 0, 1, 0}; hr= pdisp->Invoke( dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, NULL, NULL, 0); //The value of longOut will be modified by UNO function.
上面显示了 VB 代码的编写方式,因为默认情况下,VB 通过引用进行调用。调用 func()
后,value 中包含函数的输出结果:
Dim value As Long value= 10 obj.func value
参数类型按照默认映射与 UNO 类型相对应,请参阅 专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射。如果不能确定类型,请使用 VARIANT
。
Dim value As Variant value= 10; obj.func value
但是,存在一种例外情况。如果函数将一个字符 (char
) 作为参数,并且是从 VB 调用,则使用 Integer
,因为 VB 中没有字符类型。为了方便起见,COM 桥还接受将字符串作为 inout
和 out
参数:
//VB Dim value As String // string must contain only one character value= "A" Dim ret As String obj.func value
JScript 不支持 inout
和 out
参数。作为一种解决办法,桥接受 JScript Array 对象。索引 0 包含值。
// Jscript var inout= new Array(); inout[0]=123; obj.func( inout); var value= inout[0];
Out 参数与 inout
参数类似,都无需初始化变量。
//C++ long longOut; VARIANT var; VariantInit(&var); var.vt= VT_BYREF | VT_I4; var.plVal= &longOut; DISPPARAMS dispparams= { &var, 0, 1, 0}; hr= pdisp->Invoke( dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, NULL, NULL, 0); //VB Dim value As Long obj.func value //JScript var out= new Array(); obj.func(out); var value= out[0];
Content on this page is licensed under the Public Documentation License (PDL). |