資源描述:
《C#調(diào)用C++中回調(diào)函數(shù)資料整理》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、C#調(diào)用C++回調(diào)函數(shù)的問題http://www.21tx.com2008年10月24日virus12下一頁 C++的回調(diào)函數(shù)中有一個參數(shù)是,是返回一個字符串,原則如下: typedef void (*TDataEvent)(char *AData ,int ALen); 其中char *AData是從DLL中返回一個字符串,串的內(nèi)存已經(jīng)在DLL中分配了 下面中我在C#中定義的委托 public delegate void TDataEvent(Byte[] AData, int ALen)
2、; 下面是回調(diào)函數(shù)的設置代碼: Event = new clReceivelDllPoxy.TDataEvent(getDate); ReceDllPoxy.AddServer(1024, Event, 2); 其中 Event是上面委托的實例,我定義成一個成員這樣就不會被自己釋放 下面是C#中回調(diào)函數(shù)的實現(xiàn)public void getDate(byte[] AData, int ALen){//發(fā)現(xiàn)每次回調(diào)是 AData只有一個字節(jié)} 下面轉載一個別人的代碼,謝謝usingSystem
3、;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Reflection;usingSystem.Reflection.Emit;namespaceAppDllTest{ /**//// ///非托管動態(tài)調(diào)用基類,基類不能直接使用,需要實現(xiàn)FunTable()的虛函數(shù) /// publicabstractclass
4、clDllBasePoxy { //-裝入DLL--------- publicboolOpen(stringdllFileName) { Hand=LoadLibrary(dllFileName); if(Hand==0) { returnfalse; } FunSet(GetFunTable()); returntrue; } //-關閉DLL--- publicboolClose()
5、 { returnFreeLibrary(Hand)!=0; } publicabstractstring[]GetFunTable();//函數(shù)對應表由外部代理類通過GetFunTable來設置 //調(diào)用Windows32下的Kernele32庫中的裝入函數(shù)來完成對非托管DLL的引用-------#region//調(diào)用Windows32下的Kernele32庫中的裝入函數(shù)來完成對非托管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); } } //--關聯(lián)代理和DLL中的函數(shù)----------- privateboolFunSet(string[]aFun) { Typetp=this.GetType(); string[]Value;