天天看點

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)]。

補充 

5. 相關文章

繼續閱讀