程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#視頻監控系列(14):總結貼——VC++代碼轉成C#小結

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

編輯:關於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)]。

結束

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved