值对象
值对象(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). |