使用Visual Studio 2015创建VB6 dll?

dan*_*n10 4 vb6 visual-studio-2015

我有一个在Visual Studio中创建的Windows窗体应用程序.

我引用了一个COM API,我正在尝试运行它

L_RESULT = Visualfiles.SystemScript("HIST-TEL", sampleVisualBasicColl, "") 
Run Code Online (Sandbox Code Playgroud)

第二个参数需要是一个集合,所以我创建了这个

    Dim sampleVisualBasicColl As New Microsoft.VisualBasic.Collection()

    Dim item1, item2, item3, item4 As String
    item1 = "Items"
    item2 = "In"
    item3 = "A"
    item4 = "Collection"
    sampleVisualBasicColl.Add(item1, "firstkey")
    sampleVisualBasicColl.Add(item2, "secondkey")
    sampleVisualBasicColl.Add(item3, "thirdkey")
    sampleVisualBasicColl.Add(item4, "fourthkey")
Run Code Online (Sandbox Code Playgroud)

但我得到的错误就是这个

无法将"Microsoft.VisualBasic.Collection"类型的对象强制转换为"VBA.Collection".

我发现这篇文章我觉得有帮助 - https://support.microsoft.com/en-gb/kb/323737

但是如何完成步骤1-4?

我有视觉工作室社区2015,我不知道如何创建这个DLL?

谢谢你的建议!

Han*_*ant 9

Collection coclass是一个长期的麻烦制造者,微软创建了太多的实现.而且,非常不明智,给这些实现提供了相同的CLSID.不清楚这是如何错误的,可能是一组程序员没有与另一组人交谈.他们提出的糟糕解决方案是强迫每个人都应用[noncreatable]属性.

这会阻止您添加对vba7.dll的引用,以便您可以创建自己的Collection对象.这就是KB文章告诉您使用VB6创建对象实例的原因.嗯,18岁是很多狗的生活,今天已经安装了VB6.您需要获得MSDN许可证或在Ebay拍卖会上好运.

是时候以正确的方式修复它而不是那种糟糕的KB方式.您所要做的就是创建Collection对象的默认接口的具体实例.根据COM规则,接口的实现永远不重要.

在项目中添加一个新类并粘贴此代码:

Imports System.Runtime.InteropServices

Namespace VBA    
    <ComVisible(True), Guid("A4C46780-499F-101B-BB78-00AA00383CBB")>
    Public Interface _Collection
        <DispId(0)> Function Item(<[In]> ByRef Index As Object) As Object
        <DispId(1)> Sub Add(<[In]> ByRef Item As Object, ByRef Optional Key As Object = Nothing,
                        ByRef Optional Before As Object = Nothing,
                        ByRef Optional After As Object = Nothing)
        <DispId(2)> Function Count() As Integer
        <DispId(3)> Sub Remove(<[In]> ByRef Index As Object)
        <DispId(-4)> Function _NewEnum() As IEnumerator
    End Interface

    '' <ComVisible(True)>
    <ClassInterface(ClassInterfaceType.None), Guid("A4C4671C-499F-101B-BB78-00AA00383CBB")>
    Public Class Collection
        Implements _Collection
        Private impl As New Microsoft.VisualBasic.Collection

        Public Sub Add(ByRef Item As Object, ByRef Optional Key As Object = Nothing, ByRef Optional Before As Object = Nothing, ByRef Optional After As Object = Nothing) Implements _Collection.Add
            impl.Add(Item, CStr(Key), Before, After)
        End Sub

        Public Sub Remove(ByRef Index As Object) Implements _Collection.Remove
            If TypeOf Index Is String Then impl.Remove(CStr(Index)) Else impl.Remove(CInt(Index))
        End Sub

        Public Function Count() As Integer Implements _Collection.Count
            Return impl.Count
        End Function

        Public Function _NewEnum() As IEnumerator Implements _Collection._NewEnum
            Return impl.GetEnumerator()
        End Function

        Public Function Item(ByRef Index As Object) As Object Implements _Collection.Item
            Return impl(Index)
        End Function
    End Class
End Namespace
Run Code Online (Sandbox Code Playgroud)

因此,不是创建一个新的Collection对象,而是创建一个新的VBA.Collection对象来保持组件的快乐.我没有一个好的方法来测试它,希望它有效.