arrays - 评估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 接口返回的数组变量?
解决方案
我已经确认移植到 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;类型不匹配是由于语言只能处理变体类型数组。
推荐阅读
- java - 用于相互身份验证的 AES256 密码交换 - 客户端 - 服务器之间的不同加密结果
- gitlab-ci - 如何使用“连续”激活调试日志?
- c# - 如何防止硒测试跳过断言
- python - 熊猫:用相同的重复名称/键组的第一个值填充空值
- java - 用 ? 声明变量的区别 扩展超类
- php - 在 inwidget restyler 中使用 imgproxy
- google-apps-script - Google Search Console 的点击次数低于 Google Analytics 中的 Orgainc Search
- android - 蓝牙的 MediaRouter selectRoute 不会切换到华为 Android 10 的手机
- javascript - 可搜索的选择框库 Select2 无法工作
- python - 向日期列添加时间间隔