【问题标题】:How can I call a method (of a COM object) that returns an array of objects from VBScript如何调用从 VBScript 返回对象数组的(COM 对象的)方法
【发布时间】:2014-09-29 04:06:03
【问题描述】:

我有一个 COM 对象“Foo”,它定义了一个返回 Bar 数组的函数:

public Bar[] Bars()
{
    return bars;
}

这是在向 COM 注册的 DLL 中。

我可以像这样从 VBA 调用它:

Dim aBars() As Bar
aBars = oFoo.Bars()

Dim oBar As Bar
Set oBar = aBars(0)

但是,我需要从不支持早期绑定的 VBScript 中调用相同的函数,当我尝试这样做时,它会失败:

Dim aBars
aBars = oFoo.Bars()

Dim oBar
Set oBar = aBars(0) ' fails with 'Type Mismatch'

如果我检查 'aBars' 的类型,它是 'Unknown()',我猜这就是它不知道如何处理它的原因。

我可以做些什么来完成这项工作?

【问题讨论】:

标签: vba vbscript com interop


【解决方案1】:

Bar 类或接口的属性有问题,它没有像脚本语言那样实现 IDispatch。只有 IUnknown,这是 VBA 可以处理但 VBScript 不能处理的东西。根据脚本运行时的需要,IDispatch 需要支持后期绑定。

我根本看不到 Bar,所以只能猜测。如果它是实现接口的接口或类,那么您需要[InterfaceType(ComInterfaceType.InterfaceIsDual)] 以获得对早期和后期绑定的支持。或者 ComInterfaceType.InterfaceIsIDispatch 用于后期绑定。

如果是课程,那么您需要[ClassInterface(ClassInterfaceType.AutoDual)] 以获得早期和晚期的支持。或 ClassInterfaceType.AutoDispatch 迟到。

样板式避免麻烦是:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IBar {
    // etc...
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Bar : IBar {
    // etc...
}

它同时支持早期和后期绑定,并且是隐藏类实现细节的好方法,一个强大的 COM 目标,避免从 Bar 的基类 System.Object 方法中引入的包袱。

【讨论】:

  • 听起来合乎逻辑,+1 :)
  • 谢谢汉斯。不幸的是(?)这正是类和接口的定义方式!我可以单独处理这些对象——只是这个方法返回了一个有问题的数组。我发现另一个 q/a 表明不能像这样使用(从函数返回)用户类型的数组,您需要改用 ArrayList...
  • 只有当“用户类型”是 struct 时才会出现问题。不要使用结构,它们在 COM 中很麻烦。你强迫我猜测一个答案,不知道你为什么没有用 Bar 的声明更新你的问题。
【解决方案2】:

您需要返回一个ComVisible(并且可枚举)的类,例如:

public Array Bars()
{
    return bars;
}

ArrayList,类似这样的:

public ArrayList Bars()
{
    ArrayList list = new ArrayList();
    // etc...
    return list;
}

或者如果你不喜欢 ArrayList,可以这样:

public BarList Bars()
{
    BarList list = new BarList();
    // etc...
    return list;
}

[ComVisible(true)]
public class BarList : List<Bar>
{
}

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2011-09-25
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多