我有一个现有的VB.net类库,它具有一个带有VB的Collection类类型的公共属性。我将类库公开为COM对象,以便能够在进度中使用它。
当我使用整数索引(例如comObj.OutputCol.Item(1))访问Collection-属性时,它工作得很好,但是当我尝试使用字符串索引器(例如comObj.OutputCol.Item("FirstCol"))时,我得到以下错误(来自用于测试的VBScript ):
错误消息:类不支持自动化 错误代码: 800A01AE
是否可以通过COM以任何方式使用字符串索引器?
示例代码,COM-object I VB.net:
<ComClass(TestClass.ClassId, TestClass.InterfaceId, TestClass.EventsId)>
Public Class TestClass
Public Const ClassId As String = "063CA388-9926-44EC-B3A6-856D5299C210"
Public Const InterfaceId As String = "094ECC57-4E84-423A-B20E-BD109AEDBC20"
Public Const EventsId As String = "038B18BD-54B4-42D3-B868-71F4C52345B0"
Private _sOutputCol As Collection = Nothing
Private Property sOutputCol() As Collection
Get
If _sOutputCol Is Nothing Then
_sOutputCol = New Collection()
End If
Return _sOutputCol
End Get
Set(ByVal Value As Collection)
_sOutputCol = Value
End Set
End Property
Public ReadOnly Property OutputCol() As Collection
Get
Return sOutputCol
End Get
End Property
Public Sub New()
sOutputCol.Add("First object", "FirstCol")
sOutputCol.Add(2, "SecondCol")
End Sub
End ClassVBScript中的示例测试代码:
Set comObj = WScript.CreateObject("VbComTest.TestClass")
wscript.echo comObj.OutputCol.Item(1) ' Works
wscript.echo comObj.OutputCol.Item(CStr("FirstCol")) ' Gives the error我已经用:>regasm "...path...\VbComTest.dll" /codebase注册了dll
发布于 2015-02-23 13:20:12
好的,问题是索引器重载了,您不应该在COM可见接口:https://msdn.microsoft.com/en-us/library/ms182197.aspx中使用索引器。
从页面中提取重载方法发生的情况:
当向COM客户端公开重载方法时,只有第一个方法重载保留其名称。随后的重载通过在名称中附加一个下划线字符'_‘和一个与重载声明顺序相对应的整数来唯一地重命名。例如,请考虑以下方法。 void SomeMethod(int valueOne);void SomeMethod(int valueOne,int valueTwo,int valueThree);void SomeMethod(int valueOne,int valueTwo); 这些方法按以下方式公开给COM客户端。 void SomeMethod(int valueOne);void SomeMethod_2(int valueOne,int valueTwo,int valueThree);void SomeMethod_3(int valueOne,int valueTwo); VisualBasic6COM客户端不能使用名称中的下划线来实现接口方法。
因此,要使用字符串索引器,我必须编写:
wscript.echo comObj.OutputCol.Item_3("FirstCol")(Item_2接受一个对象作为参数,如果文档是正确的,它也会工作)。
https://stackoverflow.com/questions/28674011
复制相似问题