VC++ __stdcall C# 中的回调

VC++ __stdcall callbacks in C#

本文关键字:回调 stdcall VC++      更新时间:2023-10-16

我正在开发一个需要调用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 结果 = ....行整个程序出去吃午饭,表明我可能在处理回调时仍然做错了什么。谁能建议?

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

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

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