欢迎来到天天文库
浏览记录
ID:37909678
大小:202.50 KB
页数:33页
时间:2019-06-02
《C#调用C++中回调函数资料整理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C#调用C++回调函数的问题http://www.21tx.com2008年10月24日virus12下一页 C++的回调函数中有一个参数是,是返回一个字符串,原则如下: typedef void (*TDataEvent)(char *AData ,int ALen); 其中char *AData是从DLL中返回一个字符串,串的内存已经在DLL中分配了 下面中我在C#中定义的委托 public delegate void TDataEvent(Byte[] AData, int ALen)
2、; 下面是回调函数的设置代码: Event = new clReceivelDllPoxy.TDataEvent(getDate); ReceDllPoxy.AddServer(1024, Event, 2); 其中 Event是上面委托的实例,我定义成一个成员这样就不会被自己释放 下面是C#中回调函数的实现public void getDate(byte[] AData, int ALen){//发现每次回调是 AData只有一个字节} 下面转载一个别人的代码,谢谢usingSystem
3、;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.Reflection.Emit;namespaceAppDllTest{ /**//// ///非托管动态调用基类,基类不能直接使用,需要实现FunTable()的虚函数 /// publicabstractclass
4、clDllBasePoxy { //-装入DLL--------- publicboolOpen(stringdllFileName) { Hand=LoadLibrary(dllFileName); if(Hand==0) { returnfalse; } FunSet(GetFunTable()); returntrue; } //-关闭DLL--- publicboolClose()
5、 { returnFreeLibrary(Hand)!=0; } publicabstractstring[]GetFunTable();//函数对应表由外部代理类通过GetFunTable来设置 //调用Windows32下的Kernele32库中的装入函数来完成对非托管DLL的引用-------#region//调用Windows32下的Kernele32库中的装入函数来完成对非托管DLL的引用------- //----------------------
6、---------------------------------------- [DllImport("Kernel32")] privatestaticexternintGetProcAddress(inthandle,Stringfuncname); [DllImport("Kernel32")] privatestaticexternintLoadLibrary(Stringfuncname); [DllImport("Kernel32")] private
7、staticexternintFreeLibrary(inthandle); privateintHand=0;//DLL的句柄 privatestaticDelegateGetAddress(intdllModule,stringfunctionname,Typet)//把指针转变成C#的代理 { intaddr=GetProcAddress(dllModule,functionname); if(addr==0) { returnnul
8、l; } else { returnMarshal.GetDelegateForFunctionPointer(newIntPtr(addr),t); } } //--关联代理和DLL中的函数----------- privateboolFunSet(string[]aFun) { Typetp=this.GetType(); string[]Value;
此文档下载收益归作者所有