C# 视频监控系列(14):总结贴——VC++代码转成C#小结
前言
關鍵字:c++ to C#?
?????原計劃是再寫一篇H264播放器轉換AVI的文章才開始寫總結的,至今未能成功,由于時間問題并且也暫時沒有這個需求,所以決定從原計劃中去掉這一章節(jié)直接進入總結貼,然后結束這個系列文章。如果公司這邊不出什么意外,可能稍候1-2月會把后續(xù)的功能作為本系列的續(xù)集來分享給大家,請諒解!
?
注意
?????本系列文章限于學習交流,注重過程,由于涉及公司,所以不提供源代碼下載,非常抱歉!!但是請大家放心,核心、實現(xiàn)以及其他能夠貼出來的代碼我都會貼出來,并且爭取盡所能的回答留言里的每一個問題,感謝大家關注,歡迎交流 :)
?
系列
?????1.?????C# 視頻監(jiān)控系列(1):準備
?????2.?????C# 視頻監(jiān)控系列(2):客戶端——封裝API
?????3.?????C# 視頻監(jiān)控系列(3):客戶端——連接服務器
?????4.?????C# 視頻監(jiān)控系列(4):客戶端——音頻接收和抓圖
?????5.?????C# 視頻監(jiān)控系列(5):客戶端——給服務器端發(fā)送字符串和錄像(數(shù)據(jù)捕獲)
?????6.?????C# 視頻監(jiān)控系列(6):服務器端——封裝API(上) [HikServer.dll]
?????7.?????C# 視頻監(jiān)控系列(7):服務器端——封裝API(下) [DS40xxSDK.dll]
?????8.?????C# 視頻監(jiān)控系列(8):服務器端——預覽和可被客戶端連接
?????9.?????C# 視頻監(jiān)控系列(9):服務器端——數(shù)據(jù)捕獲(抓圖 + 錄像)
?????10.?? ??C# 視頻監(jiān)控系列(10):服務器端——驗證、設置畫面質量、字幕疊加、板卡序列號
?????11.?????C# 視頻監(jiān)控系列(11):H264播放器——封裝API[HikPlayM4.dll]
?????12.?????C# 視頻監(jiān)控系列(12):H264播放器——播放錄像文件
?????13.?????C# 視頻監(jiān)控系列(13):H264播放器——控制播放和截圖?
?????14.?????C# 視頻監(jiān)控系列(14):總結貼——VC++代碼轉成C#小結?
?
正文?
1. 使用Marshal.AllocHGlobal(使用 GlobalAlloc 從進程的非托管內存中分配內存)創(chuàng)建IntPtr,用完之后記得用Marshal.FreeHGlobal釋放內存,否則如此該方法處在在一個無限循環(huán)中將不斷分配內存,直至內存耗盡。
?
2. 數(shù)據(jù)類型
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 傳出參數(shù)
VC++: int*/ULONG */DWORD *
C#: out int/out long/out ushort 等
VC++里面的int、long數(shù)據(jù)類型與C#轉換的時候并不嚴格,只要不超過范圍就行,所以有的地方用int也可以、用long也可以。
3. 回調函數(shù)一律聲明成成員變量
例如:
????????//將委托聲明為成員變量!!????????STREAM_DIRECT_READ_CALLBACK?sdrc;
????????///?<summary>
????????///?預覽并客戶端連接
????????///?</summary>
????????private?void?PreviewAndClientConnect()
????????{
????????????sdrc?=?new?STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);
????????????//[必須]注冊編碼圖像數(shù)據(jù)流直接讀取回調函數(shù)
????????????HikVisionSDK.RegisterStreamDirectReadCallback(sdrc,?this.Handle);
????????}
?
4. 調用委托 出錯
一般委托出錯有三種情況:
4.1 參數(shù)類型和api的類型沒有對應上,比如他是char*你給對應的是IntPtr,有可能就會出錯
4.2 委托沒有聲明成成員變量,前面已經強調過很多次也給了文章,這里就不復述了。
4.3 可能報錯說內存已經被收回之類的,你在委托上叫一個這樣的標記:[UnmanagedFunctionPointer(CallingConvention.Cdecl)]。
補充?
2010-2-3 P/invoke in .NET Compact Framework
?
5. 相關文章
?C#調用c++Dll結構體數(shù)組指針的問題
?
結束
可能還有其他地方需要注意的,這需要你自己細心的對比查看和搜索相關資料,仍然要祝你順順利利!本帖再后續(xù)的工作中會持續(xù)更新,請大家留意!
轉載:http://www.cnblogs.com/over140/archive/2009/04/03/1403924.html
總結
以上是生活随笔為你收集整理的C# 视频监控系列(14):总结贴——VC++代码转成C#小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动完成--autoComplete插件
- 下一篇: 继承的基本概念(1)