是否可以通过更改语言来解决由于评估COM接口返回的非变量数组而导致的VBScript类型不匹配错误?

时间:2019-07-08 18:46:03

标签: arrays vbscript com

我正在使用Windows应用程序,该应用程序为扩展脚本提供COM接口。简短的文档在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()(长数组)。在研究了问题之后,据我了解,除非数组的类型为Variant,否则VBScript无法按索引访问数组的元素。这是VBScript作为一种语言的局限性。我无法实现this answer中的更改,因为我没有对要扩展的应用程序的源访问权。

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

1 个答案:

答案 0 :(得分:0)

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