• 締切済み

VB.NETにて、構造体へデータをセットするにはどうすればよいですか?

バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか? ご教授よろしくお願いします。 ファイルサイズは構造体のサイズと同じく300byteです。 Public Structure ST1 <VBFixedString(10), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=10)> _ Public str1() As String <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> _ Public str2() As String <VBFixedString(30), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=30)> _ Public str3() As String Public Sub Initialize() ReDim str1(4) ReDim str2(4) ReDim str3(4) End Sub End Structure 処理 Private Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click dim ST as new ST1 ST.Initialize() FileOpen(1, OpenFileDialog1.FileName, OpenMode.Binary, OpenAccess.Read, OpenShare.Default)) FileGet(1, ST) FileClose(1) End Sub ここでわからないのが、イニシャライズを行い、配列数を設定しても、ファイルから読み込んでくるバイト数は配列でないときと同じサイズ(60byte)で読み込んできてしまいます。 STをイニシャライズしても、Marshal.SizeOf(ST)の値が変わらないのが原因だと思うのですが、宣言の仕方がおかしいのでしょうか? ご教授お願いいたします。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

マーシャリングを <VBFIxedArray(4), VBFixedString(10), MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=10)> _ Public str1() As String といった具合に変更して 構造体の属性に <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> を追加してみてください 構造体のメンバーがVBFixedString属性がついていないと 文字列の長さ(2Byte)+文字列のデータ といった具合のデータ構造を要求します これによりFileGetで読み込んだ際 Streamの終端を越えてしまうのではないでしょうか

AKARI0418
質問者

お礼

回答ありがとうございます。 早速指摘していただいた変更を実装し実行してみました。 正しく処理を行うことができました。 行き詰っておりましたので本当に助かりました、ありがとうございます。 重ねて申し訳ないのですが、よろしければマーシャリングの宣言について、何か参考になる図書がありましたら、教えていただけないでしょうか?

関連するQ&A

専門家に質問してみよう