C/C++ による汎用 DLL を作成する その6

いよいよ最終回です。
今回はメンバにポインタを含む構造体を受け渡す方法について紹介します。

DLL 側で次のような関数を公開します。

構造体メンバにはアドレスのみを格納し、実体は別の場所にあるような場合を想定しています。

C# 側では構造体に IntPtr 構造体を含めて定義します。

DLL 側から構造体を返してもらうため、前回紹介したように Marshal.AllocHGlobal() メソッドを始めとした IntPtr 構造体を利用した方法を用います。取得した構造体メンバにもまた IntPtr 構造体が含まれているため、これを利用して値を取得します。

上記のサンプルでは、double 型の配列の先頭アドレスが IntPtr 構造体となっています。IntPtr 構造体から double 型の数値を取得するときは、一度 Int64 に変換し、これを BitConverter.Int64BitsToDouble() メソッドで double 型に変換します。

実行結果は次のようになります。

クリップボード06

以上、全 6 回に渡って C# から C/C++ で作成した DLL を扱う方法についてまとめました。
ここで紹介した以外にも様々なパターンがあるかもしれませんが、基本は同じなのでだいたい対応できるようになったかなと思います。C# にはあまり似合わない泥臭いコードではありますが、C/C++ との窓口となるための重要な部分ですのでそうなって然るべきで、誤解のないようにきちんと押さえておくべきポイントかなと思います。