clq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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;
        }

posted on 2011-11-28 11:47  clq  阅读(968)  评论(0编辑  收藏  举报