タイトル : Re^7: 構造体のメモリコピー 投稿日 : 2005/01/14(Fri) 14:37 投稿者 : 魔界の仮面弁士
> すなわち、System.Runtime.InteropServices.Marshal を使う事になります。 説明は不要かと思いますが、折角なので、Marshalクラスによるサンプルも書いておきます。 '=== マーシャリング用に、文字列長などの情報を付加しておく === <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=1)> _ Public Structure recv_area1 Public a As Integer <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=10)> _ Public b As String End Structure <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _ Public Structure recv_area2 <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _ Public c As String End Structure '=== 以下、操作用のコード === Dim Buf As MSG_BUFFER Dim Area1 As recv_area1 Dim Area2 As recv_area2 '取得元となるサンプルデータ Buf.M_Buffer_Area = New Byte() { _ &HD2, &H2, &H96, &H49, _ &HB5, &H30, &HF3, &H30, &HD7, &H30, &HEB, &H30, &HC7, &H30, _ &HFC, &H30, &HBF, &H30, &H67, &H30, &H59, &H30, &H2, &H30, _ &HC2, &H53, &H3, &H80, &H6B, &H30, &H6A, &H30, &H8A, &H30, _ &H7E, &H30, &H59, &H30, &H4B, &H30, &H6D, &H30, &H3F, &H0 _ } Dim IPtr As IntPtr, O As Object Dim BufSize As Integer '0番目の位置から recv_area1 に読み込む BufSize = Marshal.SizeOf(Area1) IPtr = Marshal.AllocHGlobal(BufSize) Marshal.Copy(Buf.M_Buffer_Area, 0, IPtr, BufSize) O = Marshal.PtrToStructure(IPtr, GetType(recv_area1)) Area1 = DirectCast(O, recv_area1) Marshal.FreeHGlobal(IPtr) '4番目の位置から recv_area2 に読み込む BufSize = Marshal.SizeOf(Area2) IPtr = Marshal.AllocHGlobal(BufSize) Marshal.Copy(Buf.M_Buffer_Area, 4, IPtr, BufSize) O = Marshal.PtrToStructure(IPtr, GetType(recv_area2)) Area2 = DirectCast(O, recv_area2) Marshal.FreeHGlobal(IPtr) 'recv_area1, recv_area2 の内容を確認 Trace.WriteLine("recv_area1.a = " & Area1.a) Trace.WriteLine("recv_area1.b = " & Area1.b) Trace.WriteLine("recv_area2.c = " & Area2.c) |