[CPP][C#]
※追記 これはダメなやり方。
※MarshalクラスのMarshal.PtrToStructure()/Marshal.StructureToPtr()を使おう
※
※ネタ元
これで正解なのかわからないが、とりあえずできたのでメモ。
C#の方はunsafeを有効にしておく。
C#側
[DllImport("kernel32.dll")] static extern unsafe void CopyMemory(void* dst, void* src, int size); // 受け渡し用構造体(32bit前提) [StructLayout(LayoutKind.Sequential)] public struct StData { public Int32 data0; public Int32 data1; public Int32 data2; public Int32 data3; public Int32 data4; }; public bool GetData(int p_data){ StData data; data.data0 = 100; data.data1 = 200; data.data2 = 300; data.data3 = 400; data.data4 = 500; unsafe { CopyMemory((void*)p_data, &p_data, sizeof(StData)); } }
C++側(32bitアプリ)
// 受け渡し用構造体 typedef struct _StData { long data0; long data1; long data2; long data3; long data4; }StData; ... { CoInitialize(0); { CCSharpModule obj; if( obj.CreateDispatch(CLSID_CSharpModule) != FALSE ){ StData st_data; obj.GetData((long)&st_data); }else{ // 失敗 } // 後片付け obj.ReleaseDispatch(); } CoUninitialize(); }
C#でDLLを作ってC++から呼ぶ基本手順はこちら
ネタ元