tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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)

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。