アプリ版:「スタンプのみでお礼する」機能のリリースについて

バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか?
ご教授よろしくお願いします。
ファイルサイズは構造体のサイズと同じく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)の値が変わらないのが原因だと思うのですが、宣言の仕方がおかしいのでしょうか?

ご教授お願いいたします。

A 回答 (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の終端を越えてしまうのではないでしょうか
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
早速指摘していただいた変更を実装し実行してみました。
正しく処理を行うことができました。
行き詰っておりましたので本当に助かりました、ありがとうございます。

重ねて申し訳ないのですが、よろしければマーシャリングの宣言について、何か参考になる図書がありましたら、教えていただけないでしょうか?

お礼日時:2008/11/19 08:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A