如何实现VB6中未初始化数组通过COM接口传递至.NET环境?

2026-05-06 13:031阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计590个文字,预计阅读时间需要3分钟。

如何实现VB6中未初始化数组通过COM接口传递至.NET环境?

我想用VB.NET编写的组件替换用VB6编写的组件。新组件必须与VB6应用程序一起使用,直到它们被完全替换。我遇到了一个将字符串数组作为参数的函数。我正在使用包含此函数的VB6类来复制。

我想用VB.NET编写的新组件替换用VB6编写的组件.新组件必须与其他VB6应用程序一起使用,直到它们被替换.我遇到了一个将字符串数组作为参数的函数.

我正在使用包含此函数的VB6类来复制问题:

Public Function MyMethod(arr() As String, arr2() As String, Result$) As Integer Result = Join(arr, ", ") MyMethod = 0 End Function

我可以通过这样的测试程序(VB6)成功调用它,它显示“Hello,World”:

如何实现VB6中未初始化数组通过COM接口传递至.NET环境?

Dim obj As Object Dim arr() As String Dim arr2() As String Dim result As String Set obj = CreateObject("MyHelloWorld.MyClass") 'Set obj = CreateObject("HelloWorldCOMNet.MyNetClass") arr = Split("Hello World", " ") 'ReDim arr2(0) result = "" If Not obj.MyMethod(arr, arr2, result) Then MsgBox result End If

我无法修改实际的VB6应用程序,但我想用.NET编写的类替换VB6 ActiveX组件.新类看起来像这样:

<ComClass("cd74ab4a-76ca-4c84-9f49-147e6f6ac01f", "b3314f71-cb8d-48ea-bfe6-9d1995aa4f58", "40c30052-0cc8-4ef6-b1e8-92e4ddbcb515")> _ Public Class MyNetClass Public Sub New() MyBase.New() End Sub Public Function MyMethod(ByRef arr() As String, ByRef arr2() As String, ByRef result As String) As Short result = String.Join(", ", arr) + " from .NET" Return 0 End Function End Class

我通过在测试应用程序中用Set obj = CreateObject(“HelloWorldCOMNet.MyNetClass”)替换Set obj = CreateObject(“MyHelloWorld.MyClass”)来测试它.

我在.NET类的构造函数中使用断点来验证它是否已被执行.

当测试应用程序调用MyMethod时,会发生FatalExecutionEngineException.

我将误差缩小到第二个参数arr2.当我使用ReDim arr2(0)初始化变量时,.NET代码可以正常工作.所以我的猜测是,这与该变量未初始化的事实有关.不幸的是我无法修改实际的VB6应用程序.

我使用OleWoo比较了方法签名,它们看起来是相同的(除了id).

如何修改.NET函数的签名以接受未初始化的字符串数组?

编辑:OleWoo的输出:

[id(0x00000001)] short MyMethod( [in, out] SAFEARRAY(BSTR)* arr, [in, out] SAFEARRAY(BSTR)* arr2, [in, out] BSTR* result ); 我相信这是.NET Framework中的一个错误.

我将调试器附加到VB6应用程序.这是崩溃时的堆栈跟踪:

这是该位置的反汇编代码:

这是函数DispatchInfo::IsVariantByrefStaticArray.它取消引用(* V_ARRAYREF(pOle))的结果而不检查它是否为NULL.成员fFeatures位于偏移2处,导致地址0x00000002处的访问冲突.

我相信这是我偶然发现的问题.我想我必须找到另一种方法来解决我原来的问题.

本文共计590个文字,预计阅读时间需要3分钟。

如何实现VB6中未初始化数组通过COM接口传递至.NET环境?

我想用VB.NET编写的组件替换用VB6编写的组件。新组件必须与VB6应用程序一起使用,直到它们被完全替换。我遇到了一个将字符串数组作为参数的函数。我正在使用包含此函数的VB6类来复制。

我想用VB.NET编写的新组件替换用VB6编写的组件.新组件必须与其他VB6应用程序一起使用,直到它们被替换.我遇到了一个将字符串数组作为参数的函数.

我正在使用包含此函数的VB6类来复制问题:

Public Function MyMethod(arr() As String, arr2() As String, Result$) As Integer Result = Join(arr, ", ") MyMethod = 0 End Function

我可以通过这样的测试程序(VB6)成功调用它,它显示“Hello,World”:

如何实现VB6中未初始化数组通过COM接口传递至.NET环境?

Dim obj As Object Dim arr() As String Dim arr2() As String Dim result As String Set obj = CreateObject("MyHelloWorld.MyClass") 'Set obj = CreateObject("HelloWorldCOMNet.MyNetClass") arr = Split("Hello World", " ") 'ReDim arr2(0) result = "" If Not obj.MyMethod(arr, arr2, result) Then MsgBox result End If

我无法修改实际的VB6应用程序,但我想用.NET编写的类替换VB6 ActiveX组件.新类看起来像这样:

<ComClass("cd74ab4a-76ca-4c84-9f49-147e6f6ac01f", "b3314f71-cb8d-48ea-bfe6-9d1995aa4f58", "40c30052-0cc8-4ef6-b1e8-92e4ddbcb515")> _ Public Class MyNetClass Public Sub New() MyBase.New() End Sub Public Function MyMethod(ByRef arr() As String, ByRef arr2() As String, ByRef result As String) As Short result = String.Join(", ", arr) + " from .NET" Return 0 End Function End Class

我通过在测试应用程序中用Set obj = CreateObject(“HelloWorldCOMNet.MyNetClass”)替换Set obj = CreateObject(“MyHelloWorld.MyClass”)来测试它.

我在.NET类的构造函数中使用断点来验证它是否已被执行.

当测试应用程序调用MyMethod时,会发生FatalExecutionEngineException.

我将误差缩小到第二个参数arr2.当我使用ReDim arr2(0)初始化变量时,.NET代码可以正常工作.所以我的猜测是,这与该变量未初始化的事实有关.不幸的是我无法修改实际的VB6应用程序.

我使用OleWoo比较了方法签名,它们看起来是相同的(除了id).

如何修改.NET函数的签名以接受未初始化的字符串数组?

编辑:OleWoo的输出:

[id(0x00000001)] short MyMethod( [in, out] SAFEARRAY(BSTR)* arr, [in, out] SAFEARRAY(BSTR)* arr2, [in, out] BSTR* result ); 我相信这是.NET Framework中的一个错误.

我将调试器附加到VB6应用程序.这是崩溃时的堆栈跟踪:

这是该位置的反汇编代码:

这是函数DispatchInfo::IsVariantByrefStaticArray.它取消引用(* V_ARRAYREF(pOle))的结果而不检查它是否为NULL.成员fFeatures位于偏移2处,导致地址0x00000002处的访问冲突.

我相信这是我偶然发现的问题.我想我必须找到另一种方法来解决我原来的问题.