タイトル | : Re^7: 構造体のメモリコピー |
記事No | : 1280 |
投稿日 | : 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)
|