2

C# プロジェクトで c++ で記述された DLL を使用しています。このコードを使用して、DLL 内で関数を呼び出すことができました。

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr VmHidScan();

ここで、カスタム型ポインターを必要とする関数を呼び出す必要があります。DLL レイアウトのドキュメントは、次のように機能します。

hid_get_info(int n,PDEV_INFO *pdi)

このカスタム ポインターの使用方法がわかりません。これは DLL で定義されていますか? もしそうなら、C#プロジェクトからどのように使用できますか? そうでない場合は、ヘッダー ファイルを C# に含める必要がありますか? よろしくお願いします。

4

3 に答える 3

4

「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() を使用して構造体の値を取得します。構造を解放する必要がないことを願っています。

2 番目の解釈は、"pid" が DEV_INFO 構造体へのポインターの配列を返すというものです。"n" 引数が指定されている可能性があります。これは、渡す配列内の要素の数が関数によって満たされることを意味する可能性があります。その場合、IntPtr[] を渡し、「n」をその長さに設定します。

于 2010-02-04T19:03:03.927 に答える
0

structC++ で C++ をミラーリングする C# でを作成する必要がありますPDEV_INFO struct

構造体に適用[StructLayout(LayoutKind.Sequential)]してから、C++ 構造体 (ヘッダー ファイルを参照) からフィールドを順番にコピーする必要があります。

その後、 をパラメーターとしてextern受け取るメソッドを作成できます。structref

于 2010-02-04T19:02:12.893 に答える
0

であると安全に仮定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);
}
于 2010-02-04T19:02:40.897 に答える