[英]How to pass an uninitialized array from VB6 to .NET via COM?
我想用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”:
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("MyHelloWorld.MyClass")
替換為Set obj = CreateObject("HelloWorldCOMNet.MyNetClass")
來進行測試。
我在.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中的錯誤。
那就是函數DispatchInfo :: IsVariantByrefStaticArray 。 它取消引用(*V_ARRAYREF(pOle))
的結果,而不檢查其是否為NULL。 成員fFeatures
的偏移量為2,導致地址0x00000002的訪問沖突。
我相信這是我偶然發現的問題。 我認為我將不得不尋找另一種方法來解決我原來的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.