• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
工作日志
工作日志
博客园    首页    新随笔    联系   管理    订阅  订阅
C# 视频监控系列(14):总结贴——VC++代码转成C#小结

C# 视频监控系列(14):总结贴——VC++代码转成C#小结

豆豆网   技术应用频道   2009年04月08日  【字号:小 中 大】 收藏本文

被过滤广告
关键字: NetBIOS 向导程序 ActiveX DataReader Lambda表达式

C# 视频监控系列(14):总结贴——VC++代码转成C#小结。

  前言

  原计划是再写一篇H264播放器转换AVI的文章才开始写总结的,至今未能成功,由于时间问题并且也暂时没有这个需求,所以决定从原计划中去掉这一章节直接进入总结贴,然后结束这个系列文章。如果公司这边不出什么意外,可能稍候1-2月会把后续的功能作为本系列的续集来分享给大家,请谅解!

  正文

   1.   使用Marshal.AllocHGlobal(使用 GlobalAlloc 从进程的非托管内存中分配内存)创建IntPtr,用完之后记得用Marshal.FreeHGlobal释放内存,否则如此该方法处在在一个无限循环中将不断分配内存,直至内存耗尽。

   2.   数据类型

      2.1   结构体传输一般都会加上ref

         VC++:

            int __stdcall StartVideoPreview(HANDLE hChannelHandle,HWND WndHandle,  RECT *rect,BOOLEAN bOverlay, int VideoFormat, int FrameRate)

         C#:

            public static extern int StartVideoPreview(IntPtr hChannelHandle, IntPtr WndHandle,ref Rectangle rect, bool bOverlay, int VideoFormat, int FrameRate);

         注:RECT和Rectangle均为结构体

      2.2   指针类型

         VC++:   HWND、HANDLE  

         C#:   IntPtr 一般是取控件窗体的句柄  Panel.Handle

      2.2   颜色

         VC++:   COLORREF

         C#:   int   Color.FromArgb(255, 0, 255).ToArgb()

      2.3   传出参数

         VC++:   int*/ULONG */DWORD *    

         C#:   out int/out long/out ushort 等

         VC++里面的int、long数据类型与C#转换的时候并不严格,只要不超过范围就行,所以有的地方用int也可以、用long也可以。

   3.   回调函数一律声明成成员变量

      例如:

        //将委托声明为成员变量!!
        STREAM_DIRECT_READ_CALLBACK sdrc;

        /// <summary>
        /// 预览并客户端连接
        /// </summary>
        private void PreviewAndClientConnect()
        {

            sdrc = new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);

            //[必须]注册编码图像数据流直接读取回调函数
            HikVisionSDK.RegisterStreamDirectReadCallback(sdrc, this.Handle);
        }

   4.   调用委托 出错

      一般委托出错有三种情况:

      4.1   参数类型和api的类型没有对应上,比如他是char*你给对应的是IntPtr,有可能就会出错

      4.2   委托没有声明成成员变量,前面已经强调过很多次也给了文章,这里就不复述了。

      4.3   可能报错说内存已经被收回之类的,你在委托上叫一个这样的标记:[UnmanagedFunctionPointer(CallingConvention.Cdecl)]。

  结束

   可能还有其他地方需要注意的,这需要你自己细心的对比查看和搜索相关资料,仍然要祝你顺顺利利!本帖再后续的工作中会持续更新,请大家留意!

posted on 2009-05-11 11:09  滴水藏海映太阳  阅读(247)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3