C#回调函数求解
我调用了一个dll文件中的函数,有个回调函数做参数,我使用了C#中的委托,但是只能回调回来一次数据,就出现vshost32.exe停止工作,理论上它应该循环回调视频数据的,下面是代码,高分求教,谢谢。//定义委托
public delegate void AVDataCallback(int nHandle, int bVideo, byte* pData, int len, IntPtr pParam);
//调用外部函数
[DllImport("P2PAPI.dll", CallingConvention = CallingConvention.StdCall)]
extern internal static int P2PAPI_SetAVDataCallBack(int nHandle, AVDataCallback AVCallback, IntPtr pParam);
//实例化
P2PAPI.AVDataCallback avdata = new P2PAPI.AVDataCallback(AVDataCallBack);
//引用
P2PAPI.P2PAPI_SetAVDataCallBack(nHandle, avdata, this.Handle);//这个this.Handle不知道,原来C++里面写的是this,没接触过C++,不理解,就写了这个this,Handle
//委托函数
public void AVDataCallBack(int nHandle, int bVideo, byte* pData, int len, IntPtr pParam)
{
MessageBox.Show("呵呵");
}
理论上执行后会不断弹出显示“呵呵”的对话框,但是只显示了一次就出现了vshost32.exe停止工作。求指教。
c# delegate 视频 C++ --------------------编程问答-------------------- 回调函数知道的不多 帮你顶一下了 --------------------编程问答-------------------- P2PAPI.AVDataCallback avdata = new P2PAPI.AVDataCallback(AVDataCallBack);放到page_load外! --------------------编程问答-------------------- 大荒擒天指。。帮顶 --------------------编程问答-------------------- 调用c++的时候,貌似是需要改点东西的。。具体的不太知道。。 --------------------编程问答-------------------- 放外面的也不行呀。 --------------------编程问答-------------------- 看了一下,就我个人认为,
你能够收到一次回调就说明,回调的写法是没有问题的
但我认为,可能还需要注意以下几点:
1:使用C++代码进行测试,以确保这个问题只会在C#出现。
2:参数是否合理:nHandle,是怎么分配的?pParam 是如何分配的?有用,还是没有用?如果没有用可以传递
IntPrt.Zero。
3:this.Handle,你的代码是WinForm吗??如果是,这个句柄传入进去是希望底层使用这个句柄绘图吗。如果不是,就不要传这个参数。
4:确保avdata这个委托实例,在底层会回调的任何时间,没有被GC回收掉。如果被回收掉也去引起错误。
另:应用程序停止工作,在Win32的程序中,通常是由于内存访问起的。所以可以检查 P2PAPI_SetAVDataCallBack 参数的合法性。 --------------------编程问答-------------------- 给你个看看,希望能给你带来帮助
private static void DisplayCBFun(int nPort, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReserved)
{
}
是不是要求是静态的? --------------------编程问答-------------------- nHandle看起来是一个整数,怎么是this呢。 --------------------编程问答-------------------- 这个函数是干什么的 有长度 有句柄 还有数据 和名字什么的 --------------------编程问答-------------------- 6楼的感觉分析的很有道理,但是我刚刚接触C#,这些想法比较难实际操作,我感觉是参数传递的有问题,但是不知道怎么修改,有什么具体点的方法吗?谢谢了。 --------------------编程问答-------------------- 8楼说的那个,我是由C++的代码看了之后写的,为什么我也没明白呢。呵呵。 --------------------编程问答-------------------- 顶下,继续支持
补充:.NET技术 , C#