Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Bridge/Value Objects"
|  (New page: {{Documentation/DevGuide/ProUNOTOC/Zh |ProUNO2c=block |ABridgeSvcMgr=block |ABridgeTM=block |ShowPrevNext=block |PrevPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Client-Side Conversions |N...) | m | ||
| Line 7: | Line 7: | ||
| |NextPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Exceptions and Errorcodes | |NextPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Exceptions and Errorcodes | ||
| }} | }} | ||
| − | + | {{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/Bridge/{{SUBPAGENAME}}}} | |
| {{DISPLAYTITLE:值对象}} | {{DISPLAYTITLE:值对象}} | ||
Latest revision as of 03:09, 14 May 2009
值对象(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). | 

