c#调用c++函数,传入函数指针用于回调
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
public delegate int pDataRec(int sid, int iusrdata, int idatatype, IntPtr pdata, int ilen);// 定义委托 pDataRec pdataRec = new pDataRec(dataRec); private static int dataRec(int sid, int iusrdata, int idatatype, IntPtr pdata, int ilen) //回调原型 { } m_hSession = HIKS_CreatePlayer((IntPtr)null, (int)pictureBox1.Handle, pdataRec, msgBack, 1);//调用
调用的时候要用pdataRec 否则会出现
对“testPlayer!testPlayer.Form1+pDataRec::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
原文链接:https://blog.csdn.net/zhangjie_xiaoke/article/details/6102207
实现:
public unsafe delegate bool Pdatarec(HANDLE_CONN conn, long nevent, void* precv); unsafe Pdatarec prec = new Pdatarec(func); public static unsafe bool func(HANDLE_CONN conn, long nEvent, void* pRecv) { //此处增加处理逻辑 return true; } //调用 IntPtr p_data=IntPtr.Zero; IFixApi.Fix_SetConnEvent(HandleConn,Marshal.GetFunctionPointerForDelegate(prec),p_data);
不安全代码需要增加unsafe关键字,可对项目属性修改勾选“允许不安全代码”
仅供参考,内容中会引用部分博友的文章。(侵删)
分类:
备忘知识点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示