Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Bridge/Mapping of Simple Types"
m (New page: {{Documentation/DevGuide/ProUNOTOC/Zh |ProUNO2c=block |ABridgeSvcMgr=block |ABridgeTM=block |ABridgeDM=block |ShowPrevNext=block |PrevPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Default M...) |
m |
||
(3 intermediate revisions by the same user not shown) | |||
Line 8: | Line 8: | ||
|NextPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Mapping of Hyper and Decimal | |NextPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Mapping of Hyper and Decimal | ||
}} | }} | ||
− | + | {{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/Bridge/{{SUBPAGENAME}}}} | |
{{DISPLAYTITLE:简单类型的映射}} | {{DISPLAYTITLE:简单类型的映射}} | ||
− | + | 许多语言都拥有与 IDL 简单类型等同的内容,如整数类型和浮点类型。但是,有些语言可能不支持所有这些类型。例如,JScript 是一种无类型语言,只能识别一般的数字类型。在内部,其使用四字节有符号整数值和双精度值表示一个数值。当调用将 float 作为参数的 UNO 方法并且在某点将值返回调用程序时,值可能稍有不同。这是因为桥将双精度数转换成了浮点数,最后又将浮点数转换成了双精度数。 | |
− | |||
− | + | 如果 UNO 方法将 any 作为参数,并且实现需要 any 内的某一类型,则桥就不一定总是能够提供所需要的值。假定 UNO 方法接受包含短整数的 any 且要从 Jscript 调用该方法,则桥将提供一个包含四字节整数的 any。这可能会导致调用的发起者端出现异常。解决方案是使用值对象 ([[Documentation/DevGuide/ProUNO/Bridge/Value Objects|专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射 - 值对象]])。 | |
+ | |||
+ | |||
+ | 与 Automation 不同,UNO 中存在无符号整数类型。如果提供的正值超出有符号类型的最大值,就必须使用对应的负值。例如,在 VB 中调用以下 UNO 函数,当传递值为 32768 (0x8000) 时就需要传递 -32768。 | ||
//UNO IDL | //UNO IDL | ||
Line 24: | Line 26: | ||
obj.foo(val) | obj.foo(val) | ||
− | + | ||
+ | 计算所对应负值的规则为: | ||
signed_value = unsigned_value - (max_unsigned +1) | signed_value = unsigned_value - (max_unsigned +1) | ||
− | + | ||
+ | 在前面示例中,unsigned_value 是我们要传递的值 32768。对于 VB 类型整数,该值太大超出了可以表示的范围。这就是我们为什么必须提供一个负值的原因,对于二字节整数,max_unsigned 的值为 65535。因此,计算方程为 | ||
-32768 = 32768 - (65535 + 1) | -32768 = 32768 - (65535 + 1) | ||
− | + | ||
+ | 此外,您也可以使用值的范围更大的类型。然后,Automation 桥将执行一次收缩转换。 | ||
Dim val As Long 'four byte signed integer | Dim val As Long 'four byte signed integer | ||
Line 38: | Line 43: | ||
obj.foo(val)'expects a two byte unsigned int | obj.foo(val)'expects a two byte unsigned int | ||
− | + | ||
+ | 有关转换的详细信息,请参阅 [[Zh/Documentation/DevGuide/ProUNO/Bridge/Conversion Mappings|专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射 - 转换映射]] 一章。 | ||
{{PDL1}} | {{PDL1}} | ||
− | [[Category: | + | [[Category:文档/开发者指南/专业 UNO]] |
Latest revision as of 03:06, 14 May 2009
许多语言都拥有与 IDL 简单类型等同的内容,如整数类型和浮点类型。但是,有些语言可能不支持所有这些类型。例如,JScript 是一种无类型语言,只能识别一般的数字类型。在内部,其使用四字节有符号整数值和双精度值表示一个数值。当调用将 float 作为参数的 UNO 方法并且在某点将值返回调用程序时,值可能稍有不同。这是因为桥将双精度数转换成了浮点数,最后又将浮点数转换成了双精度数。
如果 UNO 方法将 any 作为参数,并且实现需要 any 内的某一类型,则桥就不一定总是能够提供所需要的值。假定 UNO 方法接受包含短整数的 any 且要从 Jscript 调用该方法,则桥将提供一个包含四字节整数的 any。这可能会导致调用的发起者端出现异常。解决方案是使用值对象 (专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射 - 值对象)。
与 Automation 不同,UNO 中存在无符号整数类型。如果提供的正值超出有符号类型的最大值,就必须使用对应的负值。例如,在 VB 中调用以下 UNO 函数,当传递值为 32768 (0x8000) 时就需要传递 -32768。
//UNO IDL void foo(unsigned short value); 'VB Dim val As Integer 'two byte signed integer val = -32768 obj.foo(val)
计算所对应负值的规则为:
signed_value = unsigned_value - (max_unsigned +1)
在前面示例中,unsigned_value 是我们要传递的值 32768。对于 VB 类型整数,该值太大超出了可以表示的范围。这就是我们为什么必须提供一个负值的原因,对于二字节整数,max_unsigned 的值为 65535。因此,计算方程为
-32768 = 32768 - (65535 + 1)
此外,您也可以使用值的范围更大的类型。然后,Automation 桥将执行一次收缩转换。
Dim val As Long 'four byte signed integer val = 32768 obj.foo(val)'expects a two byte unsigned int
有关转换的详细信息,请参阅 专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射 - 转换映射 一章。
Content on this page is licensed under the Public Documentation License (PDL). |