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

时间:2022-11-06 19:01:12

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中