C#のからC ++で記述されたDLLからカスタムタイプの呼び出し
-
18-09-2019 - |
質問
私はC#プロジェクトにC ++で記述されたDLLを使用しています。私はこのコードを使用してDLL内の関数を呼び出すことができました。
[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr VmHidScan();
今、私はカスタム型のポインタをrequres関数を呼び出す必要があります。 DLLのためのドキュメントは、レイアウト、このような関数ます:
hid_get_info(int n,PDEV_INFO *pdi)
私はこのカスタムポインタを使用する方法がわかりません。これは、DLLで定義されていますか?もしそうなら、どのようにC#プロジェクトから使用できますか?ない場合は、私はC#でのヘッダーファイルをインクルードする必要がありますか?あなたの助けを事前に感謝します。
解決
「P」の接頭辞を考えると、それは本当の宣言があるように
に見えますhid_get_info(int n, DEV_INFO **pdi)
DEV_INFO構造です。あなたは、この構造体の宣言を見つけ、[StructLayout]属性を使用してC#コードに追加する必要があります。次に、あなたのC#コードで、次のように関数を宣言したい:
[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);
と構造の値を得るためにMarshal.PtrToStructure()を使用します。あなたは構造体を解放する必要はありませんうまくいけば、あなたはねじ込みされると思います。
第二の解釈は、「PID」構造をDEV_INFOへのポインタの配列を返すことです。ややそうなだけでなく、あなたが関数によって満たされることに渡す配列の要素数を意味するかもしれません「N」引数を、与えられました。その場合は、[]のIntPtrを通過し、その長さ「n」を設定します。
他のヒント
あなたはC ++でC ++ struct
のPDEV_INFO
を反映C#でstruct
を作成する必要があります。
あなたは順番に(ヘッダファイルを見て)構造体に[StructLayout(LayoutKind.Sequential)]
を適用し、C ++構造体からフィールドをコピーする必要があります。
これで、extern
パラメータとしてstruct
を取るref
メソッドを書くことができます。
私は無事PDEV_INFO*
がDEV_INFO**
であると仮定します。
C#でこれを使用します:
class DEV_INFO
{
// fields go here
}
static class NativeMethods
{
[DllImport...]
public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}