C#側からC++で書いたdllの関数を呼び出したいのですが、C++側のその呼び出す関数の引数がポインタの構造体で、またその構造体の中にはさらにポインタの構造体が定義されているなどしてうまくいきません。
自分である程度やってみたのですが関数は呼び出せるものの値が正しく入っていません(渡された変数がNullになっている)、助言の方いただきたいです
C++
1//C++側の呼びたい関数(dllの公開関数) 2int __stdcall FunctionA(StructA *value) 3 4//構造体StructAの中身 5struct StructA { 6 unsigned short aaa; 7 StructB* bbb; 8 }; 9 10//構造体StructBの中身 11struct StructB { 12 unsigned short* Buffer; 13 unsigned int iWidth; 14 };
C#
1//うまくいっていないが試したコード 2//定義部分 3[StructLayout(LayoutKind.Sequential)] 4public struct StructA 5{ 6 public ushort aaa; 7 public StructB bbb; 8} 9 10[StructLayout(LayoutKind.Sequential)] 11public struct StructB 12{ 13 public Intptr Buffer; 14 public int iWidth; 15} 16 17//関数 18[DllImport("○○.dll")] 19public extern static int FunctionA(ref StructA value); 20 21 22//C#で呼び出す部分 23 StructA value = new StructA(); 24 value.bbb = new StructB(); 25 value.aaa = 100; 26 value.bbb.Buffer = Marshal.AllocCoTaskMem((Marshal.SizeOf(typeof(byte)) * ○○(必要なサイズ分確保)); 27 value.bbb.iWidth = 1000; 28 Marshal.Copy(data, 0, value.bbb.Buffer, data.Length); //(dataはC++側に渡したいデータ) 29 FunctionA(ref value); 30
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。