如何直接访问从 VBScript 中的函数返回的数组
Posted
技术标签:
【中文标题】如何直接访问从 VBScript 中的函数返回的数组【英文标题】:How to access an array directly that is returned from a function in VBScript 【发布时间】:2020-04-10 21:23:00 【问题描述】:我有一个返回数组的 COM 对象函数。
此代码有效
Dim a
a = obj.Foo
MsgBox a(0)
这段代码表示没有枚举。这是真的。
MsgBox obj.Foo(0)
这也没用
MsgBox (obj.Foo)(0)
问题在于 Foo 函数是一个简单的属性。
有直接访问数据成员的语法吗?
编辑:只是为了明确函数工作正常 IsArray(obj.Foo) 返回 true!
【问题讨论】:
您应该能够执行obj.Foo(0).get()
或obj.Foo(0).FirstOrDefault()
之类的操作。我不完全确定你是如何得到结果的,因为我不是 vb 专家,但我相信应该有一些东西可以按照我的建议调用。
@AliBeyit 不在 VBScript 中,你不能。
这取决于 COM 对象返回的数据类型,VBScript 需要 VT_ARRAY
,因此您需要编组 COM 可见的返回类型。
这能回答你的问题吗? How to correctly marshal VB-Script arrays to and from a COM component written in C#
数组是一个 SAFEARRAY 的 VARIANTs。否则第一种方法行不通。
【参考方案1】:
我认为这里的问题是通过 COM 返回的变量数组需要成为一个 VB 集合对象,这不会立即发生。
当有中间变量时会发生,但在表达式的情况下还不会发生。在后一种情况下,VBScript 已经将其视为对象,但该对象是变体数组的薄包装器,它还不是集合对象。
如果你想要一个 VBS 单行,这将是可行的:
Function TrueArray(ByVal Value)
TrueArray = Value
End Function
'MsgBox obj.Foo(0) -- Object not a collection: 'obj.Foo'
MsgBox TrueArray(obj.Foo)(0)
您还可以在属性实现的另一端实现集合并返回它而不是安全数组(ATL C++ 代码将使用CComEnum<IEnumVARIANT...
助手,example)。
我知道您的问题更多是关于执行所需转换的内置脚本语言功能。也许您可以使用一些内置函数来执行与上述TrueArray
类似的技巧。
【讨论】:
以上是关于如何直接访问从 VBScript 中的函数返回的数组的主要内容,如果未能解决你的问题,请参考以下文章