gpt4 book ai didi

c# - C# 中的 VC++ __stdcall 回调

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:02 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c# - C# 中的 VC++ __stdcall 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11344987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com