4

C++ dll を呼び出す必要がある C# gui アプリケーションに取り組んでいます。特定の 1 つを除いて、すべての呼び出しが機能しているようです。C++ ヘッダー ファイルから、関数とコールバック シグネチャは次のようになります。

typedef void (__stdcall *LPFNDLL_RECEIVE_CALLBACK)(CANMsg*);

USBCANPLUS_API
CAN_STATUS __stdcall canplus_setReceiveCallBack(
    CANHANDLE handle,
    LPFNDLL_RECEIVE_CALLBACK cbfn
);

測定値に基づいて、呼び出しを次のようにラップするセットアップと内部クラスがあります。

[DllImport("USBCanPlusDllF.dll")]
public static extern int canplus_setReceiveCallBack(int handle, CallbackDelegate callback);

[UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
public delegate void CallbackDelegate(ref CANMsg msg);

そして次のように使用されます:

    private static void callback(ref EASYSYNC.CANMsg msg)
    {
        Debug.Print(msg.id + ":" + msg.timestamp + ":" + msg.flags + ":" + msg.len + ":" + msg.data);
    }

    static EASYSYNC.CallbackDelegate del = new EASYSYNC.CallbackDelegate(callback);

    private void button1_Click(object sender, EventArgs e)
    {
        int handle = EASYSYNC.canplus_Open(IntPtr.Zero, "1000", IntPtr.Zero, IntPtr.Zero, 0);

        if(handle > 0)
        {
            int result = EASYSYNC.canplus_setReceiveCallBack(handle, del);
        }
    }

C# で C++ コールバックを処理するのは難しいことを知っており、この件について少し調べたので、上記のコードを用意しました。私の問題は、私のコードが int result = .... 行にヒットすることです. 誰でもアドバイスできますか?

4

1 に答える 1

0

これについては少しわかりませんが、デリゲートの呼び出し規約をStdCallに指定しました(これはC / C ++コードがそう言っているためです)が、canplus_setReceiveCallBack()dllimport関数宣言では行いませんでした。次のことを行うと機能します。

[DllImport("USBCanPlusDllF.dll", CallingConvention=CallingConvention.StdCall)]
public static extern int canplus_setReceiveCallBack(int handle, CallbackDelegate callback);

私が言ったように、私は確信が持てませんが、これは問題かもしれません。

于 2012-10-13T19:19:58.200 に答える