http://www.cnblogs.com/joe62/archive/2009/12/18/1626900.html
C#处理C++库回调报错_非托管代码传递委托被垃圾回收
检测到 CallbackOnCollectedDelegate
Message: 对“HBVideoParser!Videocomm.Video.HB.HBSDK+SrcDataParseCBHandler::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
[DllImport("...")]
public static extern bool HB_SDVR_SetParseCallBack(int lRealHandle, SrcDataParseCBHandler SrcDataParseCBFun, int nRseserved);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void SrcDataParseCBHandler(int nChl, System.IntPtr SrcDataBuf, int nSize, int nFrameType, VIDEO_TIME ets, int user);
SrcDataParseCBHandler srcDataParseCBHandler ;
public int Start()
{
...
srcDataParseCBHandler = OnSrcDataParseCBHandler;
bool resb = HBSDK.HB_SDVR_SetParseCallBack(CookieID, srcDataParseCBHandler, CookieID);
...
}
public void OnSrcDataParseCBHandler(int nChl, System.IntPtr SrcDataBuf, int nSize, int nFrameType, VIDEO_TIME ets, int user)
{...}
--------------------------------------------------
public Form1()
{
InitializeComponent();
tt = MsgBack;
}
private void button1_Click(object sender, EventArgs e)
{
int r = hkClient.InitStreamClientLib();//为 0 是正确的
//int m_hSession = hkClient.HIKS_CreatePlayer(0, this.panel1.Handle, usb, usa, 0);
//int m_hSession = hkClient.HIKS_CreatePlayer(null, this.panel1.Handle, null, pMsgFun, 0);//-1 好像不对
//m_hSession = hkClient.HIKS_CreatePlayer(null, this.panel1.Handle, null, MsgBack, 0);//返回 -1 好像不对,MsgBack 不能为空//参考 http://wenku.baidu.com/view/55281040be1e650e52ea992f.html
m_hSession = hkClient.HIKS_CreatePlayer(null, this.panel1.Handle, null, tt, 0);//返回 -1 好像不对,MsgBack 不能为空//参考 http://wenku.baidu.com/view/55281040be1e650e52ea992f.html
//MsgBack 好象得用全局静态委托,否则会被回收的?
r = hkClient.HIKS_OpenURL(m_hSession, "rtsp://127.0.0.1/172.x.x.x:8000:HIK-DS8000HC:0:0:admin:12345/av_stream", 0);
while (m_opened < 0) Thread.Sleep(100);
r = hkClient.HIKS_Play(m_hSession);//奇怪,不能在回调函数里打开
}//
public pMsgBack tt;
//private int MsgBack(int sid, int opt, int param1, int param2)
private int MsgBack(int sid, int opt, int param1, int param2)//ll//好象得用全局静态委托,否则会被回收的?
{
Console.WriteLine("msgBack:opt={0},param1={1},param2={2}", opt, param1, param2);
int len = -1;
switch (opt)
{
case 1:
//m_totaltime = param1;
break;
case 2:
m_opened = param1;
//this.setOpened(param1);
//int r = hkClient.HIKS_OpenURL(m_hSession, "rtsp://127.0.0.1/172.x.x.x:8000:HIK-DS8000HC:0:0:admin:12345/av_stream", 0);
//int r = hkClient.HIKS_Play(m_hSession);//奇怪,不能在回调函数里打开
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7://暂停
//this.m_Pause = 1;
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
//m_speeded = true;
break;
case 14:
//PostMessage(WM_DISCONNECT,0,0);
break;
default:
break;
}
return 0;
}