繁体   English   中英

C ++中的VC ++ __stdcall回调

[英]VC++ __stdcall callbacks in C#

我正在研究需要调用C ++ DLL的C#gui应用程序。 似乎所有呼叫都在工作,除了特别是一个。 从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 = .... line整个程序出去吃午饭表示我可能仍然在处理回调时出错了。 任何人都可以建议吗?

我对此有点不确定,但你已经将委托上的调用约定指定为StdCall(它必须是因为C / C ++代码这样说)但是你没有为canplus_setReceiveCallBack()dllimport函数声明做这个,当你执行以下操作时,它可以工作:

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

正如我所说,我不确定,但这可能是问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM