C++库调用C#的回调函数异常退出解决

C++库调用C#的回调函数异常退出解决

为了从dll向上层传递消息,往往需要从上层向dll中传递回调函数

在C++中定义函数指针:

typedef int (CALLBACK *p_process_rawdata)(char * buf, unsigned int size);

这里一定要定义为CALLBACK,CALLBACK是系统定义的一个宏,代表__stdcall

函数调用较多的协定有__cdecl、__stdcall等

前者是c语言默认的函数调用方式,所有参数从右向左一次压栈,由调用者清空栈,c中仅支持这种调用方式。

__stdcall是standard call的缩写,是C++的标准调用方式,栈由被调用函数清理;这种调用方式下函数的参数个数必须是确定的,而__cdecl的参数个数则可以是不确定的。

在回调函数中一定要将函数的调用方式定义为stdcall,否则每当调用到回调函数时主调程序可能会异常退出。

在C\C++中定义一个导出函数用户设置函调函数。比如:

__declspec(dllexport) int deliverfunc(p_process_rawdata video)

{

draw_frame=video;

}

c#中定义回调函数的委托,参数格式和返回参数与c中回调函数指针相同。

public unsafe delegate int processdata(byte* p, uint a);

[DllImport(@"..\..\..\Debug\buptlibrecv.dll", EntryPoint = "deliverfunc", SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]

        extern static int deliverfunc(processdata video);

定义相应的函数,调用deliverfunc即可将回调函数传递到dll中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值