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?
谢谢你的建议!
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对象来保持组件的快乐.我没有一个好的方法来测试它,希望它有效.
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |