C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C++(or C)で保存されたファイルの読み書き


(過去ログ 112 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■66337 / inTopicNo.1)  C++(or C)で保存されたファイルの読み書き
  
□投稿者/ のぶ (16回)-(2013/04/16(Tue) 16:10:19)

分類:[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);
    }
  }
}

引用返信 編集キー/
■66342 / inTopicNo.2)  Re[1]: C++(or C)で保存されたファイルの読み書き
□投稿者/ Hongliang (51回)-(2013/04/16(Tue) 19:55:59)
> [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;
> }

アンマネージとの相互運用で、C/C++におけるchar・wchar_t・TCHARなどに対するC#の型としてcharを使用するのはお勧めしません。
byte/sbyteやushortを使用するようにしましょう。

引用返信 編集キー/
■66353 / inTopicNo.3)  Re[2]: C++(or C)で保存されたファイルの読み書き
□投稿者/ のぶ (17回)-(2013/04/17(Wed) 14:28:31)
No66342 (Hongliang さん) に返信

ご回答ありがとうございます。

> アンマネージとの相互運用で、C/C++におけるchar・wchar_t・TCHARなどに対するC#の型としてcharを使用するのはお勧めしません。
> byte/sbyteやushortを使用するようにしましょう。

char[]をbyte[]に変更したら例外が発生しなくなりました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -