none
VBAからVB.NETライブラリへの構造体受け渡しに関して RRS feed

  • 質問

  • Excel2010, VB.NET (.NET 4.5, VS2012)環境下にて、VBAからVB.NETが公開する構造体に

    参照渡しした結果を受け取りたいのですが、メモリリークが発生してExcelが異常終了してしまいます。

    データの値は正常に受け渡されているのですが、何が原因でしょうか?

    CrashDumpファイルを開くと「0x0000005」が設定されており、

    スレッドが、適切なアクセス権のない仮想アドレスに対して読み取りまたは書き込みを行おうとしました。

    となります。

    -------------------------------------------------------------------------------------------------------

    以下、データ構造体です。sDataは可変引数となっています。

    Sizeに関しては、計算にずれはない状態にしています。

        <ComVisible(True), Guid("自動生成値")>
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Size:=28 + 16)>
        Structure sDataGroup 
            Dim head As sHeader
            Dim data() As sData
        End Structure
    
        <ComVisible(True), Guid("自動生成値")>
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Size:=28)>
        Structure sHeader 
            Dim data As Integer
            ' 省略   
        End Structure
    
        <ComVisible(True), Guid("自動生成値")>
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Size:=16)>
        Structure As sData
            Dim data As Integer
            ' 省略   
        End Structure

    VB.NET側の処理にて以下の公開したメソッドを用意しています。

    Function method(ByVal data As Integer, ByRef data2 As sDataGroup, ByRef data3 As sDataGroup, ByRef data4 As sDataGroup) As Integer


    VBA側で、公開された構造体データに対して可変部のメモリを確保して受け渡した結果

    ウォッチで確認すると内部データは先頭、末尾共に変更されていますが、この関数のExit Subが呼ばれたあとに

    Excelが異常終了します。

    Dim data2 As VBDLL.sDataGroup

    Dim data3 As VBDLL.sDataGroup

    Dim data4 As VBDLL.sDataGroup

    ReDim data2.sData(10)

    ReDim data3.sData(10)

    ReDim data4.sData(10) Dim intData As Integer ' データ設定 Dim vbClass As New VBDLLClass vbClass.method(intData, data2, data3, data4) Set vbClass = Nothing

    可変部のマーシャリングがいまいちなのでしょうか?

    宜しくおねがいします。

    ------------------------------

    追記

    上記の宣言順を変更した所異常終了しなくなりました。

    Dim data2 As VBDLL.sDataGroup
    ReDim data2.sData(10)
    
    Dim data3 As VBDLL.sDataGroup
    ReDim data3.sData(10)
    
    Dim data4 As VBDLL.sDataGroup
    ReDim data4.sData(10)
    
    Dim intData As Integer
    
    ' データ設定
    
    Dim vbClass As New VBDLLClass
    vbClass.method(intData, data2, data3, data4)
    Set vbClass = Nothing

    おそらく、メモリ確保のエリアが変わったことによって

    メモリリーク領域からハズレた結果、取り敢えず異常終了しなくなったのだと思いますが・・・

    根本的な解決になっていないので・・・。

    ------------------------------

    • 編集済み mogja 2018年7月30日 8:48
    2018年7月30日 7:56