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中