如何直接访问从 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 中的函数返回的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何访问从sql函数获取的java中的多个返回值

从 vbscript 访问中运行宏和子

如何从 C++ 中的函数返回结构?

如何从 Swift 中的 void 闭包中返回一个值?

如何将解析器中的数据传递给函数

如何从 minos 中的 RestRequest 访问 aiohttp 的请求