ParamArray 不适用于 COM

问题描述 投票:0回答:2

我有一个向 COM 公开的类库,如下所示:

<ComClass(SomeClass.ClassId, SomeClass.InterfaceId, SomeClass.EventsId)>
Public Class SomeClass

    Public Const ClassId As String = "GUID1"
    Public Const InterfaceId As String = "GUID2"
    Public Const EventsId As String = "GUID3"

    Public Sub SomeMethod(ByVal ParamArray values() As Object)
        ''//Some Code Here    
    End Sub
End Class

然后我使用 regasm /tlb /codebase 来注册它。所有方法和属性似乎在 VBA/VB6 中都能正常工作,但是当我尝试使用 ParamArray 访问方法时,它不会进行事件编译。我收到错误:

编译错误:

函数或接口标记为受限,或者函数使用 Visual Basic 不支持的自动化类型。

我需要做什么才能正确公开此方法,以便我可以像这样使用它?:

SomeClass.SomeMethod 1, 2, 3
.net vb.net com paramarray
2个回答
3
投票

该函数使用 Visual Basic 不支持的自动化类型。

问题到此为止,VB6 中没有相当于参数数组的东西。 删除 ParamArray 关键字。 VB6 代码必须传递 Variants 数组。 不愉快,考虑重新设计你的类。


0
投票

需要几个手动步骤才能使其工作:

  • 删除 ParamArray 关键字
  • 按参考制作
  • 编译它
  • 使用 TlbExp.exe 导出 tlb
  • 在oleviewer中加载tlb
  • 保存 IDL 文件
  • 编辑 IDL 文件并在方法 ID 后添加“, varargs”
  • 使用 midl 编译 IDL
  • 注册tlb

这适用于 VB98 及更早版本,并且也应该适用于 VBA。

如果编译器允许提到的 ByRef 不带 ParamArray,并且接受参数值中的 ParamArrayAttribute 和 InAttribute,那么事情可能会更容易。在这种情况下,tlbexp 应该生成并编译方法签名为

[id(0x1),可变参数]
void SomeMethod([in] SAFEARRAY(VARIANT)* 值)

© www.soinside.com 2019 - 2024. All rights reserved.