值对象
值对象(Value Object)是可以通过桥获取的 Automation 对象。由于它可以包含值和类型说明,因此类似于 UNO any 或 VARIANT。“值对象”可以用作从 Automation 语言调用 UNO 方法的各种参数。当桥需要参数转换的附加信息时,就会使用“值对象”。当 UNO 方法接受 any 作为参数时,就会使用“值对象”。但是,在许多情况下,如果提供的参数恰好映射至默认映射中所需的 UNO 类型,则可以没有“值对象”。例如,UNO 方法接受 any 作为希望包含 short 的参数。在 Visual Basic 中提供 Long 就已经足够了。但是在 JScript 中,不存在类型,并且四字节整数将被隐式传送到调用。Any 将不会包含 short 且调用可能会失败。在这种情况下,“值对象”将确保进行准确的转换。
在只能识别函数 in 参数的语言中,“值对象”使得还可以识别 in/out 和 out 参数。由于 可以将数组对象和“值对象”用于这些参数,因此 JScript 是一个特例。
Value Object 提供可以通过 IDispatch 访问的四个函数。它们是:
void Set( [in]VARIANT type, [in]VARIANT value);
- 指定类型和值。
void Get( [out,retval] VARIANT* val);
- 返回对象中包含的值。Value Object 被用作 inout 或 out 参数时,还会使用 Get。
void InitOutParam();
- 通知对象其被用作 out 参数。
void InitInOutParam( [in]VARIANT type, [in]VARIANT value);
- 通知对象其被用作 inout 参数,并传递 in 参数的值以及类型。
如果将 Value Object 用作 in 或 inout 参数,则指定值的类型。除了“对象”名称以外,类型名称与 UNO IDL 中使用的名称一一对应。下表显示可以指定哪些类型。
| 名称(与 Value Object 一起使用) | UNO IDL |
|---|---|
| char | char |
| boolean | boolean |
| byte | byte |
| unsigned | unsigned byte |
| short | short |
| unsigned short | unsigned short |
| long | long |
| unsigned long | unsigned long |
| string | string |
| float | float |
| double | double |
| any | any |
| object | some UNO interface |
要示意值为序列,请在名称前面加上括号,例如
[]char - sequence<char> [][]char - sequence < sequence <char > > [][][]char - sequence < sequence < sequence < char > > >
Value Object 是由桥提供的,并且可以从服务管理器对象获取。服务管理器是用 ProgId“com.sun.star.ServiceManager” 注册的 COM 组件(请参阅 专业 UNO - UNO 语言绑定 - Automation 桥 - 服务器管理器组件 一章)。例如:
// JScript var valueObject= objSericeManager.Bridge_GetValueObject();
要将 Value Object 用作 in 参数,请指定类型并将值传送到对象:
// UNO IDL
void doSomething( [in] sequence< short > ar);
// JScript
var value= objServiceManager.Bridge_GetValueObject();
var array= new Array(1,2,3);
value.Set("[]short",array);
object.doSomething( value);
在上面的示例中,Value Object 被定义成由短整型值组成的一个序列。数组也可能又包含 Value Object:
var value1= objServiceManager.Bridge_GetValueObject();
var value2= objServiceManager.Bridge_GetValueObject();
value1.Set("short“, 100);
value2.Set("short", 111);
var array= new Array();
array[0]= value1;
array[1]= value2;
var allValue= objServiceManager.Bridge_GetValueObject();
allValue.Set("[]short“, array);
object.doSomething( allValue);
如果函数接受 out 参数,请按下面所示的那样通知 Value Object:
// UNO IDL void doSomething( [out] long);
// JScript var value= objServiceManager.Bridge_GetValueObject(); value.InitOutParam(); object.doSomething( value); var out= value.Get();
当 Value Object 为 inout 参数时,还需要知道类型和值:
//UNO IDL void doSomething( [inout] long);
//JScript
var value= objServiceManager.Bridge_GetValueObject();
value.InitInOutParam("long", 123);
object.doSomething(value);
var out= value.Get();
| Content on this page is licensed under the Public Documentation License (PDL). |