日期:2014-05-17  浏览次数:21320 次

C#中使用委托来实现CALLBACK报错
C++的回调
BOOL NET_DVR_SetRealDataCallBack(LONG lRealHandle,void(CALLBACK *fRealDataCallBack) (LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser),DWORD dwUser)
C++中的使用
void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser){}
NET_DVR_SetRealDataCallBack(m_iPlayhandle, RealDataCallBack, m_iPlayhandle);


C#中的定义
public delegate void fRealDataCallBack( int realHandle, int dataType,ref byte[] vBuffer, int bufSize, int userID);  
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetRealDataCallBack (int realHandle, fRealDataCallBack RealDataCallBack , int userID);

C#中的使用
public void RD( int realHandle, int dataType,ref byte[] vBuffer, int bufSize, int userID){}

某函数中调用委托
byte[] vBuff = new byte[1000] ; 
int vBuffNum = 0;
NetSDK.fRealDataCallBack xx = RD; 
ASCIIEncoding encoding = new ASCIIEncoding();
vBuff = encoding.GetBytes("235rewgfdfsfasdfsadf");
// rc(realHandle[0], 1, ref vBuff, 50, 0); // 可成功执行
NetSDK.NET_DVR_SetRealDataCallBack(realHandle[0], xx, userID);  
// 出错,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。


请教问题出在哪里.


------解决方案--------------------
c#和c++交互最恶心的就是这个内存已损坏,再帮你看看。
------解决方案--------------------
帮你顶一下,学习贴
------解决方案--------------------
C# 方面, DWORD 要对应 UInt32

主要出错在C++那边,声明有问题
------解决方案--------------------
探讨
dword可以用int,我测试过了,其他调用也是这样转换

------解决方案--------------------
回帖也有分?那一定帮你顶啦,楼下继续
------解决方案--------------------
// rc(realHandle[0], 1, ref vBuff, 50, 0); // 可成功执行 

然而:NetSDK.NET_DVR_SetRealDataCallBack(realHandle[0], xx, userID); 报错.楼主仔细检查一下,有没有参数的值为空

------解决方案--------------------
帮顶