|
分類:[C#]
いつもお世話になっています。
C++(またはC)で保存されたファイルの読み書きを行うプログラムを作成していますが
例外が発生してしまい、その例外をどのように対処すればいいのか分からないのでお教え下さい。
ファイルからの読み込みは期待通りの結果となっており、それを(とりあえずは)そのまま別ファイルに保存をさせようとしています。
ちなみに、読み込み後の戻り値は[ Dictionary<MarkHeader, MarkPart[]> ]としています。
しかし、いかのコード中の //ここで例外発生 という箇所で
「システム コールに渡されるデータ領域が小さすぎます。 (HRESULT からの例外: 0x8007007A)」
という例外(COMException)が発生してしまいます。
内容からバッファとして使っているbytesのサイズが小さいのかと思うのですが、サイズ自体はSizeOfで取得しているので
小さくないと思っています。
以上よろしくお願いいたします。
開発環境
Windows7
.NET Framework 3.5
Visual Studio 2010
=== 以下コード ===
[StructLayout(LayoutKind.Sequential)]
struct MarkHeader
{
internal short index;
internal short nOfParts;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
internal char[] name;
internal short hideX;
internal short hideY;
}
[StructLayout(LayoutKind.Sequential)]
struct MarkPart
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
internal char[] shapeType;
internal short startX;
internal short startY;
internal short endX;
internal short endY;
internal short radius;
}
static void Main(string[] args)
{
string path = @"C:\Users\hoge\fuga"; //fugaは拡張子無しのファイル名
var dic = Read(path);
Save(dic, @"d:\test"); //testもファイル名
}
private static void Save(Dictionary<MarkHeader, MarkPart[]> markDic, string path)
{
byte[] bytes;
MarkHeader mh;
MarkPart[] mpList;
int size;
using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
using (BinaryWriter bw = new BinaryWriter(fs))
{
foreach (var item in markDic)
{
mh = item.Key;
mpList = item.Value;
bytes = new byte[Marshal.SizeOf(typeof(MarkHeader))];
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
Marshal.StructureToPtr(mh, handle.AddrOfPinnedObject(), false); // ここで例外発生
}
finally
{
handle.Free();
}
bw.Write(bytes);
}
}
}
|