簡體   English   中英

如何通過COM將未初始化的數組從VB6傳遞到.NET?

[英]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中的錯誤。

我將調試器附加到VB6應用程序。 這是崩潰時的堆棧跟蹤: 堆棧跟蹤與DispatchInfo :: IsVariantByrefStaticArray在頂部

這是該位置的反匯編代碼: 反匯編的代碼顯示指針在偏移量2處被取消引用

那就是函數DispatchInfo :: IsVariantByrefStaticArray 它取消引用(*V_ARRAYREF(pOle))的結果,而不檢查其是否為NULL。 成員fFeatures的偏移量為2,導致地址0x00000002的訪問沖突。

我相信這是我偶然發現的問題。 我認為我將不得不尋找另一種方法來解決我原來的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM