Visual studio 2015 是否使用Visual Studio 2015创建VB6 dll?

Visual studio 2015 是否使用Visual Studio 2015创建VB6 dll?,visual-studio-2015,vb6,Visual Studio 2015,Vb6,我在Visual Studio中创建了一个windows窗体应用程序 我引用了一个COM API,我正在尝试运行它 L_RESULT = Visualfiles.SystemScript("HIST-TEL", sampleVisualBasicColl, "") 第二个参数需要一个集合,所以我创建了这个 Dim sampleVisualBasicColl As New Microsoft.VisualBasic.Collection() Dim item1, item2,

我在Visual Studio中创建了一个windows窗体应用程序

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

L_RESULT = Visualfiles.SystemScript("HIST-TEL", sampleVisualBasicColl, "") 
第二个参数需要一个集合,所以我创建了这个

    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")
但我得到的错误是

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

我发现了这篇文章,我认为它将有助于-

但我如何完成步骤1-4

我有visual studio community 2015,我不知道如何创建此dll


谢谢你的建议

集合类是一个长期的麻烦制造者,Microsoft创建了太多的集合类实现。而且,非常不明智的是,为这些实现提供了相同的CLSID。不太清楚这是怎么出了如此严重的错误的,可能是一组程序员没有和另一组交谈。他们想出的糟糕的解决方案是强迫每个人都应用[noncreatable]属性

这会阻止您添加对vba7.dll的引用,以便您可以创建自己的集合对象。这就是为什么KB文章告诉您使用VB6创建对象的实例。嗯,呃,18年是一个很大的狗的生命和谁有VB6安装了今天。您需要MSDN许可证或在易趣拍卖中获得好运

是时候用正确的方法来解决这个问题了,而不是那种糟糕的方法。您所要做的就是创建集合对象的默认接口的具体实例。根据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
导入System.Runtime.InteropServices
命名空间VBA
公共接口集合
函数项(ByRef索引作为对象)作为对象
子添加(ByRef项作为对象,ByRef可选键作为对象=无,
ByRef作为对象之前是可选的=无,
ByRef作为对象后可选(无)
函数Count()为整数
子删除(ByRef索引作为对象)
函数_NewEnum()作为IEnumerator
端接口
'' 
公共类集合
实现\u集合
私有impl作为新的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)实现_Collection.Add
实施添加(项目、CStr(关键)、之前、之后)
端接头
Public Sub Remove(ByRef索引为对象)实现_Collection.Remove
如果索引的类型是字符串,那么impl.Remove(CStr(Index))或者impl.Remove(CInt(Index))
端接头
作为整数的公共函数Count()实现_Collection.Count
返回impl.Count
端函数
作为IEnumerator实现_集合的公共函数_NewEnum()。_NewEnum
返回impl.GetEnumerator()
端函数
公共函数项(ByRef索引作为对象)作为对象实现_Collection.Item
返回impl(索引)
端函数
末级
结束命名空间

因此,现在不要创建新的集合对象,而是创建一个新的VBA.Collection对象以使组件满意。我再也没有一个好的方法来测试它了,希望它能工作。

我们不应该离开这个网站去弄清楚你在问什么。请在您的问题中包含相关信息。如果内容是非现场的,并且该非现场位置不可用(离线、移动(是的,也发生在MS)或删除),您的问题对此处的未来读者没有价值。(如果您阅读错误消息,您会看到它正在查找VBA.Collection,它不是VB6-它是Visual Basic for Applications,用于Excel、Word和其他Office应用程序。VB6是一个旧的、不再受支持的独立IDE和语言。)好的,对不起,Ken!我想做的是创建一个Visual Basic 6.0 Microsoft ActiveX DLL项目,微软的文章建议我这样做。但我不明白怎么做?我有Visual Studio 2015。谢谢你的建议。请注意,这篇文章是关于一个11年的老产品和一个18年的老产品。它甚至没有说您可以使用VS2005创建VB6 DLLAs,我说过,VB6不再受支持。您只能在VB6中创建VB6 DLL,而且VB6早已失效。另找一种方法。实际上VB6是受支持的。这些天来,束缚微软的力量阻碍了新的开发,IDE/编译器只得到了最低限度的支持(甚至连安全漏洞都没有得到修复),但VB6仍然是许多商店Windows的主干。谢谢Hans的建议,我确实找到了类似的东西并尝试了一下,但没有效果。我相信你的建议,但我得到了这个错误-附加信息:无法将类型为“ClassLibrary2.VBACollection”的对象强制转换为类型为“VBA.Collection”。谢谢你的建议!糟糕的是,修改互操作库以将参数类型更改为接口类型是必要的。与您的主管交谈,您需要MSDN订阅。很好,我知道这很令人沮丧!这只是我正在尝试做的一件小事,它将完成我的项目,并将是一个伟大的应用程序,供每个人使用,因为它将我们的两个系统连接在一起,节省了大量的时间。我已经和我的主管谈过了,但是我负担不起MSDN订阅费。你能帮我在MS文章中创建一个小dll吗?我将非常感激!谢谢youTry易趣,现在那里有一个完整的VB6,售价270美元。免责声明:存在其他拍卖网站,我本人与卖家没有任何联系。方法错误。MSDN订阅费用大约相当于程序员一周的工资。如果它“太贵”,那么你就太贵了52倍。这只是一个不想填写文件的主管的标准拒绝。