gpt4 book ai didi

vba - 如何调用从 VBScript 返回对象数组的方法(COM 对象的)

转载 作者:行者123 更新时间:2023-12-01 08:39:24 28 4
gpt4 key购买 nike

我有一个 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)

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

Dim aBars
aBars = oFoo.Bars()

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

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

我该怎么做才能使这项工作成功?

最佳答案

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

我根本看不到 Bar,所以只能猜测。如果它是接口(interface)或实现接口(interface)的类,那么您需要 [InterfaceType(ComInterfaceType.InterfaceIsDual)] 来获得对早期绑定(bind)和后期绑定(bind)的支持。或用于后期绑定(bind)的 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...
}

它支持早期和晚期绑定(bind),是隐藏类实现细节的好方法,一个强大的 COM 目标,避免从 Bar 的基类 System.Object 方法中提取的包袱。

关于vba - 如何调用从 VBScript 返回对象数组的方法(COM 对象的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25156697/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com