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