首页 > 解决方案 > 评估COM接口返回的非变量数组导致的VBScript类型不匹配错误可以通过更改语言来解决吗?

问题描述

我正在使用一个为扩展脚本提供 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 作为一种语言的限制。我无法实现此答案中的更改,因为我没有对我尝试扩展的应用程序的源访问权限。

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

标签: arraysvbscriptcom

解决方案


我已经确认移植到 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;类型不匹配是由于语言只能处理变体类型数组。


推荐阅读