C# 視頻監控系列(14):總結貼——VC++代碼轉成C#小結

來源:互聯網
上載者:User

 

前言

  關鍵字:c++ to C#

     原計劃是再寫一篇H264播放器轉換AVI的文章才開始寫總結的,至今未能成功,由於時間問題並且也暫時沒有這個需求,所以決定從原計劃中去掉這一章節直接進入總結貼,然後結束這個系列文章。如果公司這邊不出什麼意外,可能稍候1-2月會把後續的功能作為本系列的續集來分享給大家,請諒解!

 

注意

     本系列文章限於學習交流,注重過程,由於涉及公司,所以不提供原始碼下載,非常抱歉!!但是請大家放心,核心、實現以及其他能夠貼出來的代碼我都會貼出來,並且爭取盡所能的回答留言裡的每一個問題,感謝大家關注,歡迎交流

 

系列

     1.     C# 視頻監控系列(1):準備

     2.     C# 視頻監控系列(2):用戶端——封裝API

     3.     C# 視頻監控系列(3):用戶端——串連伺服器

     4.     C# 視頻監控系列(4):用戶端——音頻接收和抓圖

     5.     C# 視頻監控系列(5):用戶端——給伺服器端發送字串和錄影(資料擷取)

     6.     C# 視頻監控系列(6):伺服器端——封裝API(上) [HikServer.dll]

     7.     C# 視頻監控系列(7):伺服器端——封裝API(下) [DS40xxSDK.dll]

     8.     C# 視頻監控系列(8):伺服器端——預覽和可被用戶端串連

     9.     C# 視頻監控系列(9):伺服器端——資料擷取(抓圖 + 錄影)

     10.     C# 視頻監控系列(10):伺服器端——驗證、設定畫面品質、字幕疊加、板卡序號

     11.     C# 視頻監控系列(11):H264播放器——封裝API[HikPlayM4.dll]

     12.     C# 視頻監控系列(12):H264播放器——播放錄影檔案

     13.     C# 視頻監控系列(13):H264播放器——控制播放和 

     14.     C# 視頻監控系列(14):總結貼——VC++代碼轉成C#小結 

 

本文 

   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.FromA#ff00ff.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)]。

  

補充

  2010-2-3  P/invoke in .NET Compact Framework

 

   5. 相關文章

     C#調用c++Dll結構體數組指標的問題

 

結束

   可能還有其他地方需要注意的,這需要你自己細心的對比查看和搜尋相關資料,仍然要祝你順順利利!本帖再後續的工作中會持續更新,請大家留意!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.