返回值

From Apache OpenOffice Wiki
Jump to: navigation, search




在 UNO 中,可以通过三种方法返回值:

  • 函数返回值
  • inout 参数
  • out 参数

在大多数语言中,一般都可以返回值,但不一定支持 inoutout 参数,例如 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 桥还接受将字符串作为 inoutout 参数:

 //VB
 Dim value As String
 // string must contain only one character
 value= "A"
 Dim ret As String
 obj.func value


JScript 不支持 inoutout 参数。作为一种解决办法,桥接受 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).
Personal tools
In other languages