我有一个向 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
该函数使用 Visual Basic 不支持的自动化类型。
问题到此为止,VB6 中没有相当于参数数组的东西。 删除 ParamArray 关键字。 VB6 代码必须传递 Variants 数组。 不愉快,考虑重新设计你的类。
需要几个手动步骤才能使其工作:
这适用于 VB98 及更早版本,并且也应该适用于 VBA。
如果编译器允许提到的 ByRef 不带 ParamArray,并且接受参数值中的 ParamArrayAttribute 和 InAttribute,那么事情可能会更容易。在这种情况下,tlbexp 应该生成并编译方法签名为
[id(0x1),可变参数]
void SomeMethod([in] SAFEARRAY(VARIANT)* 值)