评估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类型不匹配错误可以通过更改语言来解决吗?的主要内容,如果未能解决你的问题,请参考以下文章
具有内部链接的变量的暂定定义具有不完整的非数组类型:一致的实现显示不同的行为