VB.netで構造体をメモリコピーするには?

解決


RAV4  2003-11-17 09:30:20  No: 109986

質問させてください。
私はVB6では、タスク間でメモリを共有する時にマップファイルを使用していました。
同じ事をVB.netでやろうとしているのですが、
構造体をRtlMoveMemoryにてマップファイルに渡そうとすると、
マーシャリングできない、というエラーが出ます。

//////////////// Code /////////////////////////////

Imports System.Runtime.InteropServices
Public Class Test
      
    ''メモリコピー関数
    ''As Anyだと怒られるので、渡す型に変えました。
    Declare Sub MemCopy Lib "kernel32" Alias "RtlMoveMemory" (ByRef hpvDest As STRC_TEST, ByVal hpvSource As Integer, ByVal cbCopy As Integer)

    <StructLayout(LayoutKind.Sequential)> Structure STRC_TEST
        Dim A As Long
        Dim B() As Integer
        Public Sub Initialize()
            ReDim B(3)
        End Sub
    End Structure

    Private Sub fncTest()
        
        Dim Test As STRC_TEST
        Dim Test2 As STRC_TEST
        Dim fhdTest As Integer           ''ファイルハンドル
        Dim mhdTest As Integer           ''作成したマップファイルハンドル
        Dim pntAdrTest As Integer        ''マップファイルのポインタ
        Dim opnMapTest As Integer        ''オープンしたマップファイルのハンドル

        ''構造体内の配列の初期化
        Test.Initialize()
        ''値をセット
        Test.A = 1
        Test.B(0) = 2
        Test.B(1) = 3
        Test.B(2) = 4
        Test.B(3) = 5
        ''ファイル作成
        intFn = FreeFile()
        FileOpen(intFn, "Test.tmp", OpenMode.Binary)
        ''ファイルに上の構造体を書き込み
        FilePut(intFn, Test)
        ''ファイルを閉じる
        FileClose(intFn)

        ''マップファイル作成
        fhdTest = CreateFile関数にて"Test.tmp"を開く
        mhdTest = CreateFileMapping関数にて"Test.Map"を作成
        opnMapTest = OpenFileMapping関数にて"Test.Map"をオープン
        pntAdrTest = MapViewOfFile関数にてTest.Mapのアドレスを取得

        ''pntAdrTestからの24バイトには、上のTest構造体の値が入っている
        ''はずなので、RtlMoveMemoryにてTest2構造体にムーブメモリーしたい。

         Call MemCopy(Test2 , pntAdrTest , 24)

         ''↑ここでエラーが出ます
型 STRC_TEST のフィールド B をマーシャリングできません : この型は構造体フィールドとして、マーシャリングできません。

        ''以下略

End Class

マーシャリングについていろいろとヘルプを見たりしましたが、
イマイチよく理解できません・・・
VB.netにて、「構造体をメモリコピーにてマップファイルに渡す」方法をソースコード付きで教えていただけないでしょうか?


あぁん  2003-11-18 02:06:00  No: 109987

>    <StructLayout(LayoutKind.Sequential)> Structure STRC_TEST
>        Dim A As Long
>        Dim B() As Integer
>        Public Sub Initialize()
>            ReDim B(3)
>        End Sub
>    End Structure

これだと、B() が動的なので、マーシャリング時にサイズが不明ですね。


RAV4  2003-11-18 18:35:53  No: 109988

あぁんさん

<VBFixedArray(3), MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)>

とする事で解決できました。
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加