C# VC++ DLL間のマーシャル
- 題名: C# VC++ DLL間のマーシャル
- 著者: mi
- 日時: 2009/08/27 12:11:36
- ID: 25306
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: C# VC++ DLL間のマーシャル
- 著者: Hongliang
- 日時: 2009/08/27 13:24:01
- ID: 25308
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: C# VC++ DLL間のマーシャル
- 著者: mi
- 日時: 2009/08/27 14:07:14
- ID: 25310
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: C# VC++ DLL間のマーシャル
- 著者: Hongliang
- 日時: 2009/08/27 14:22:02
- ID: 25312
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: C# VC++ DLL間のマーシャル
- 著者: mi
- 日時: 2009/08/27 15:10:15
- ID: 25314
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: C# VC++ DLL間のマーシャル
- 著者: Hongliang
- 日時: 2009/08/27 15:40:34
- ID: 25317
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: C# VC++ DLL間のマーシャル
- 著者: mi
- 日時: 2009/08/31 11:27:45
- ID: 25334
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になっております。 C#とVC++で作成したDLL間でデータを渡したいんですが ネスティングされた構造体へのデータのやり取りがうまくいきません。 ご教授お願いします。 ---------------------------------------------- C#側サンプル using System; using System.Runtime.InteropServices; namespace @struct { class Program { [StructLayout(LayoutKind.Sequential)] public struct ST1 { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] public string name1; public int flg1; [StructLayout(LayoutKind.Sequential)] public struct ST3 { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] public string name3; public int flg3; [StructLayout(LayoutKind.Sequential)] public struct ST2 { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] public string name2; public int flg2; }//ST2 }//ST3 }//ST1 //--------------------------------------------------------------------------- // DllImport属性 [System.Runtime.InteropServices.DllImport("dllStruct.dll")] private static extern void dllStruct(ref ST1.ST3 st1); //--------------------------------------------------------------------------- // main static void Main(string[] args) { string msg = string.Empty; ST1 st1 = new ST1(); ST1.ST3 st3 = new ST1.ST3(); ST1.ST3.ST2 st2 = new ST1.ST3.ST2(); dllStruct(ref st2); msg = "st1: " + st1.flg1 + " " + st1.name1; Console.WriteLine(msg); msg = "st2: " + st2.flg2 + " " + st2.name2; Console.WriteLine(msg); msg = "st3: " + st3.flg3 + " " + st3.name3; Console.WriteLine(msg); } } } ---------------------------------------------- VC++側サンプル #include <windows.h> #include <stdio.h> //--------------------------------------------------------------------------- //構造体 //--------------------------------------------------------------------------- typedef struct _ST2{ char name2[1024]; int flg2; }_ST2; typedef struct _ST3{ char name3[1024]; int flg3; _ST2 pat_st2; }_ST3; typedef struct _ST1 { char name1[1024]; int flg; _ST3 pat_st3; }_ST1; typedef struct _ST1* ST1; typedef struct _ST2* ST2; typedef struct _ST3* ST3; //--------------------------------------------------------------------------- //プロトタイプ宣言 //--------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void __declspec(dllexport) __stdcall dllStruct( ST1 st1) ; #ifdef __cplusplus } #endif /* __cplusplus */ //--------------------------------------------------------------------------- //エントリーポイント //--------------------------------------------------------------------------- BOOL WINAPI DllMain( HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved ) { return TRUE; } //--------------------------------------------------------------------------- // DLL関数 //--------------------------------------------------------------------------- void __declspec(dllexport) __stdcall dllStruct(ST1 st1) { st1->flg = 1; sprintf(st1->name1 ,"%s","test"); st1->pat_st3.pat_st2.flg2 = 2; st1->pat_st3.flg3 = 3; }