求助!关于回调函数中ref byte 转换成 byte[]的问题

qiubin200236 2011-10-20 09:10:04
函数原型

NET_DVR_API BOOL __stdcall NET_DVR_SetPlayDataCallBack(LONG lPlayHandle,void(CALLBACK *fPlayDataCallBack) (LONG lPlayHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser),DWORD dwUser);


转换成c#的函数如下
public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, ref byte pBuffer, uint dwBufSize, uint dwUser);
public static extern bool NET_DVR_SetPlayDataCallBack(int lPlayHandle,PlayDataCallBack x,uint dwUser);


现在需要在回调函数 PlayDataCallBack 中将pBuffer 转储,但现在不管怎么样,我只能获取到一个byte的数据,怎样才能获取完整的pBuffer[dwBufSize]?
...全文
307 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_wyp 2012-07-10
  • 打赏
  • 举报
回复
不知道你能不能看的留言,我现在也在做这个,可以告诉我的实现方式么?qq:296406546 邮箱 谢谢!
qiubin200236 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qiubin200236 的回复:]

引用 8 楼 netteans 的回复:

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, uint dwUser)
byte[] buffer = new byte[dwBufSize];
System.Runtime.Inte……
[/Quote]

哎,已经解决,用了GCHandle.Alloc以防回收托管对象,就不报错了。。
谢谢大家了,结贴
jshi123 2011-10-23
  • 打赏
  • 举报
回复
public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, [MarshalAs(42, SizeParamIndex=3)] byte[] pBuffer, uint dwBufSize, uint dwUser);
sdl2005lyx 2011-10-21
  • 打赏
  • 举报
回复
问一下,你是否有这个VC的工程?如果有,事情好办一些:

你把net的这个exe程序做为VC工程外挂测试程序,断点设置在NET_DVR_SetPlayDataCallBack函数的入口,
F5启动VC的工程,一步一步跟踪,看看pBuffer是否真的传出?
qiubin200236 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 netteans 的回复:]

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, uint dwUser)
byte[] buffer = new byte[dwBufSize];
System.Runtime.InteropServices.Marshal.Copy……
[/Quote]
因为是视频流,每秒有好几百K得数据甚至更多
回调函数会一直执行

像你那样写,一秒后就会报 “invoke类型的已垃圾回收委托进行了回调” 错误
  • 打赏
  • 举报
回复
public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, uint dwUser)
byte[] buffer = new byte[dwBufSize];
System.Runtime.InteropServices.Marshal.Copy(pBuffer, buffer, 0, buffer.Length);

没试过,貌似大概可能也许是这样子
qiubin200236 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sdl2005lyx 的回复:]

引用 3 楼 qiubin200236 的回复:

引用 1 楼 sdl2005lyx 的回复:

对应的委托参数错了,改成:
C# code

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte[] pBuffer, uint dwBufSize, uint dwUser);
……
[/Quote]
因为是回调函数,所以这里肯定是作为输出的
根据你的改了,获取到的pBuffer仍然为byte[1]
qiubin200236 2011-10-21
  • 打赏
  • 举报
回复
补充一点,取过来pBuffer值是要传入c++定义为PBYTE的类型,也就是c#定义为 ref byte的变量中
sdl2005lyx 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qiubin200236 的回复:]

引用 1 楼 sdl2005lyx 的回复:

对应的委托参数错了,改成:
C# code

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte[] pBuffer, uint dwBufSize, uint dwUser);


这样传过来的pBuffer只是byte[1],取……
[/Quote]

你这个函调函数的参数:BYTE *pBuffer,DWORD dwBufSize,给人的直观感觉是是做为输入参数来用!
如果你确认是做为输出参数,就改成:

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, [In,Out]byte[] pBuffer, uint dwBufSize, uint dwUser);


qiubin200236 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 evionmzs 的回复:]

C# code

unsafe public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte *pBuffer, uint dwBufSize, uint dwUser);
[/Quote]

这个byte *pBuffer 如何转换成byte[] 不是很清楚,可否将具体的转换描述一下
qiubin200236 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sdl2005lyx 的回复:]

对应的委托参数错了,改成:
C# code

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte[] pBuffer, uint dwBufSize, uint dwUser);
[/Quote]

这样传过来的pBuffer只是byte[1],取不到长度为dwBufSize的数组
马少华 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qiubin200236 的回复:]

引用 2 楼 evionmzs 的回复:

C# code

unsafe public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte *pBuffer, uint dwBufSize, uint dwUser);


这个byte *pBuffer 如何转换成byte[] 不是很清楚,可……
[/Quote]
byte[] byteArrayName = new byte[dwBufSize]
Marshal.Copy(new IntPtr(pBuffer), byteArrayName, 0, dwBufSize);
马少华 2011-10-21
  • 打赏
  • 举报
回复

unsafe public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte *pBuffer, uint dwBufSize, uint dwUser);
sdl2005lyx 2011-10-20
  • 打赏
  • 举报
回复
对应的委托参数错了,改成:

public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, byte[] pBuffer, uint dwBufSize, uint dwUser);

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧