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

わんくま同盟

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

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


(過去ログ 31 を表示中)
■14988 / )  構造体配列のマーシャリングについて
□投稿者/ hanayama (6回)-(2008/02/29(Fri) 19:56:14)

分類:[C#] 

2008/02/29(Fri) 19:58:09 編集(投稿者)
2008/02/29(Fri) 19:57:14 編集(投稿者)

お世話になっております。hanayamaです。

現在、C#からC++で作成した関数を呼び出そうと奮闘しています。
C++のTest関数はP_DATA構造体のポインタを受け取るのですが、
C#からこの引数を渡すにはどうすればよいでしょうか?

C#から構造体配列を作成し、その配列のアドレスをIntPtr配列に格納しましたが、
方法が間違っている気がします。。。

どなたかご教授お願いします。

以下、ためしに作成したコードです。※正しい結果は得られませんでした。

【C++の関数定義】
int Test(P_DATA* pData);

【C++のP_DATA構造体定義】
typedf struct
{
int Stat;
char Message[32];
}


【C#側のP_DATA構造体定義】
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
public struct P_DATA
{
public int Stat;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Message;
}

【C#の実装コード】

P_DATA[] data = new P_DATA[2];
data[0].Stat = 0;
data[0].Message = "aiueo\0";
data[1].Stat = 1;
data[1].Message = "kakikukeko\0";

 IntPtr pData = new IntPtr[2];

 pData[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(P_DATA)));
 pData[1] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(P_DATA)));


// 構造体アドレスをポインタへ
Marshal.StructureToPtr(data[0], pData[0], true);
Marshal.StructureToPtr(data[1], pData[1], true);

// Test関数の呼び出し
int a = Test(pData);


返信 編集キー/


管理者用

- Child Tree -