问题描述
我正在编写设备处理程序,使用C++写的DLL,其中一个部分需要用到回调函数。现在遇到的问题是使用InitDevice()函数后,回调函数能够正常运行获取返回数据,但是随后调用Close()函数,就会导致系统报出“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误。使用了N种方式也没有解决这个问题,有哪位高手能够帮帮忙啊!C++函数原形如下:extern"C"__declspec(dllexport)HANDLE__stdcallLogin(constchar*chDevIP,unsignedintnDevPort,constchar*chUserName,constchar*chPasswd);extern"C"__declspec(dllexport)void__stdcallSetCallBack(constchar*chDevType,//设备类型RealDataCallBackfnCallBack,//回调函数constchar*szLocalIp,//本机ipconstchar*szDevIp,//设备ipWORDiChannel,//通道编号UINTTransmode,//传输方式HANDLEhUserHandle);//登陆句柄extern"C"__declspec(dllexport)bool__stdcallLogout(HANDLEhUserHandle);我的C#定义://登录设备[DllImport("device.dll",EntryPoint="Login")]publicunsafestaticexternIntPtrLogin(stringstrDevIP,uintiDevPort,stringstrUserName,stringstrPasswd);//设置回调[DllImport("device.dll",EntryPoint="SetCallBack")]publicunsafestaticexternvoidSetCallBack(stringstrDevType,[MarshalAs(UnmanagedType.FunctionPtr)]RealDataCallBackfnCallBack,stringstrLocalIp,stringstrDevIp,uintiChannel,uintiTransmode,IntPtrlHandle);//退出登录,其中调用了SetCallBack函数将回调函数设置为NULL[DllImport("device.dll",EntryPoint="Logout")]publicunsafestaticexternvoidLogout(IntPtrlHandle);///定义回调接口publicunsafedelegateboolRealDataCallBack(IntPtrobjPr,intiLen);privateRealDataCallBack_fnCallBack;_fnCallBack=newRealDataCallBack(this.BroadcastMessage);publicvoidInitDevice(){//登录设备_lHandle=Login(_objDevInfo.DeviceIP,_objDevInfo.DevicePort,_objDevInfo.User,_objDevInfo.Password);if(_lHandle.ToInt32()>0){SetCallBack(_objDevInfo.DeviceType,_fnCallBack,_objLocalAddress.ToString(),_objDevInfo.DeviceIP,_objDevInfo.Channel,_objDevInfo.TransMode,_lHandle);}else{throw(newApplicationException("登录设备失败."));}}privateboolBroadcastMessage(IntPtrobjPr,intiLen){try{byte[]byteData=newbyte[iLen];Marshal.Copy(objPr,byteData,0,iLen);//以下做数据处理工作returntrue;}catch(Exceptionex){//失败处理}}//关闭设备publicvoidClose(){try{if(_lHandle.ToInt32()>0){//退出设备登录Logout(_lHandle);}}catch(Exceptionex){throw(ex);}finally{_lHandle=(IntPtr)(-1);}}
解决方案
解决方案二:
参数类型改了把ref去掉或者允许不安全代码
解决方案三:
[unsafe]
解决方案四:
如果按照你这么所说的话我想应该是c#分配的deleage地址。在c里面只能访问不能操作吧没有遇到你这样的问题。呵呵。也不知道你c里面怎么写的
解决方案五:
我一直认为问题是出现在回调函数使用上,但是一直找不到原因,所以需要高手们帮忙!
解决方案六:
而且只要出现内存错误情况后,再次调用SetCallBack函数,就会直接出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误。真是郁闷啊!请高手们快快出招!!!
解决方案七:
我顶