评估COM接口返回的非变量数组引起的VBScript类型不匹配错误可以通过更改语言来解决吗?

Posted

技术标签:

【中文标题】评估COM接口返回的非变量数组引起的VBScript类型不匹配错误可以通过更改语言来解决吗?【英文标题】:Can type mismatch error from VBScript caused by assessing non-variant array returned by COM interface be resolved by changing languages? 【发布时间】:2019-11-18 07:42:57 【问题描述】:

我正在使用一个为扩展脚本提供 COM 接口的 Windows 应用程序。很少的文档在 VBScript 中提供了一些示例,所以我开始在 VBScript 中实现我的自动化。

这看起来像:

Set App = GetObject(, "MYAPP.Application")
MyObj = App.Object
MyArr = MyObj.ArrData

IsArray(MyArr)  ' True
TypeName(MyArr) ' Long()
Lbound(MyArr)   ' 0
Ubound(MyArr)   ' 10
MyArr(1)        ' Type Mismatch Error

仔细观察,数组对象的类型是 Long()(长数组)。在研究了这个问题后,我的理解是 VBScript 不能通过索引访问数组的元素,除非数组是 Variant 类型的;这是 VBScript 作为一种语言的限制。我无法像this answer 那样实现更改,因为我没有对我要扩展的应用程序的源代码访问权限。

我看到的错误纯粹是语言的限制吗?例如,通过将我的代码移植到另一种语言(如 C#),我是否能够访问 COM 接口返回的数组变量?

【问题讨论】:

【参考方案1】:

我已经确认移植到 C# 解决了在访问 COM 接口返回的非变量数组数据时遇到的类型不匹配错误,而无需对 COM 服务器进行任何更改。

包含适当的引用后,代码变为:

var app = (MYAPP.Application)Microsoft.VisualBasic.Interaction.GetObject(null, "MYAPP.Application");
var myObj = (MYAPP.Obj) app.GetObject();
var myArr = (int[]) myObj.GetArrData();
if (myArr.Length() > 0)

    System.Console.WriteLine(myArr[0]); // prints value at index 0 without error

因此限制在 VBScript;类型不匹配是由于语言只能处理变体类型数组。

【讨论】:

如果您仍需要内置脚本语言,请尝试将其移植到 PowerShell。

以上是关于评估COM接口返回的非变量数组引起的VBScript类型不匹配错误可以通过更改语言来解决吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问由 C# 中包装的非.net API 返回的数组?

具有内部链接的变量的暂定定义具有不完整的非数组类型:一致的实现显示不同的行为

一个因xdata声明引起的隐含错误

在C语言中,怎么样定义结构体数组为全局变量?定义一个无返回值的函数,但是函数有参数可以吗?

接口八问 & 接口测试质量评估标准

python面试题- 二分法查找给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。