如何将下例的视频回调函数转成C#的????typedef void (CALLBACK *PrcVidMpegCallBack)(DWORD dwCard, BYTE *pbuff, DWORD dwSize,BOOL isKeyFrm)
/*说明:    视频MPEG压缩数据回调.参数:   dwCard:             返回的卡号.Pbuff:              视频MPEG数据的指针dwSize:              视频MPEG数据缓冲区大小,单位字节isKeyFrm:            是否使用关键帧返回值:无
*/

解决方案 »

  1.   

        /// <summary>
        /// 视频MPEG压缩数据回调.
        /// </summary>
        /// <param name="dwCard">返回的卡号.</param>
        /// <param name="pbuff">视频MPEG数据的指针</param>
        /// <param name="dwSize">视频MPEG数据缓冲区大小,单位字节</param>
        /// <param name="isKeyFrm">是否使用关键帧</param>
        delegate void PrcVidMpegCallBack(uint dwCard,[MarshalAs(UnmanagedType.LPArray)]byte[] pbuff,uint dwSize,bool isKeyFrm);
    试试看
      

  2.   

    前面加using System.Runtime.InteropServices;
      

  3.   

       public delegate void PrcVidMpegCallBack(short dwCard, ref byte[] pbuff, short dwSize, bool isKeyFrm);        public void MpegCallBack(short dwCard, ref byte[] pbuff, short dwSize, bool isKeyFrm)
            {        }
        
            private void button1_Click(object sender, EventArgs e)
            {
                PrcVidMpegCallBack _CallBack= new PrcVidMpegCallBack(MpegCallBack);
            }不知道对不对..
      

  4.   


    DWORD类型是不是就是数值类型Long?WORD呢?能不能直接把一个int类型赋值给DWORD?  
      long是有符号类型   DWORD(双字)是为了兼容性考虑定义的,目前就是unsigned   long,一个int类型的数值可以直接赋给DWORD,   不过注意DWORD是没有负数的.负的int到DWORD转换时会被转换为一个最高位为1的DWORD数(越说越乱)  
      

  5.   

    谢谢 #region 视频MPEG压缩数据回调
            /// <summary>
            /// 视频MPEG压缩数据回调
            /// </summary>
            /// <param name="dwCard"></param>卡号
            /// <param name="pbuff"></param>视频MPEG数据
            /// <param name="dwSize"></param>视频MPEG数据缓冲区大小,单位字节
            /// <param name="isKeyFrm"></param>是否使用关键帧
            [DllImport("Sa7134Capture.dll", EntryPoint = "PrcVidMpegCallBack")]
            public extern static void PrcVidMpegCallBack(Int32 dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, Int32 dwSize, bool isKeyFrm);//可以通过..
            //public delegate void PrcVidMpegCallBack(Int32 dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, Int32 dwSize, bool isKeyFrm);// 编译通不过...
            #endregion
    这里还有一个不知道怎么改????
    BOOL WINAPI VCARegVidMpegCallBack( DWORD dwCard, PrcVidMpegCallBack ppCall )说明:    注册视频MPEG压缩数据回调.参数:    dwCard: 卡号.ppCall:  需要注册的回调函数指针返回值:TRUE:   成功FALSE:  失败.
      

  6.   

    public extern static void PrcVidMpegCallBack(Int32 dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, Int32 dwSize, bool isKeyFrm);//可以通过..去掉这行!!这里是定义一个委托!BOOL VCARegVidMpegCallBack(uint dwCard,PrcVidMpegCallBack ppCall );
    完整代码应该像这样:
            /// <summary>
            /// 视频MPEG压缩数据回调.
            /// </summary>
            /// <param name="dwCard">返回的卡号.</param>
            /// <param name="pbuff">视频MPEG数据的指针</param>
            /// <param name="dwSize">视频MPEG数据缓冲区大小,单位字节</param>
            /// <param name="isKeyFrm">是否使用关键帧</param>
            public delegate void PrcVidMpegCallBack(uint dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, uint dwSize, bool isKeyFrm);        [DllImport("Sa7134Capture.dll")]
            public extern static bool VCARegVidMpegCallBack(uint dwCard, PrcVidMpegCallBack ppCall);        public void PrcVidMpeg(uint dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, uint dwSize, bool isKeyFrm)
            {
                //这个方法需要你自己实现,以供C++回调
            }        //使用
            void SomeMethod()
            {
                uint dwCard=0;//看具体情况
                bool result = false;
                result = VCARegVidMpegCallBack(dwCard, new PrcVidMpegCallBack(PrcVidMpeg));
            }
      

  7.   

    顺便问一下,LZ用的什么采集卡?型号or牌子