海康的官方Demo有個C#版本的演示項目
這個演示項目最重要的類是那個C#調用C++接口的映射類
這個類的所在文件的名稱為HCNetSDK.cs
至於這個類的細節 鑒於篇幅的關系 就不復制粘貼過來了
下面要說的是C#在調用這些轉換過來的C#代碼接口的關鍵點
放眼望去 HCNetSDK.cs這個文件里的類 很多都是指針句柄化的int類型的參數
在C#里面對應的是IntPtr類型(IntPtc這個類型就不詳細說明了)
這個類型的正確使用 就是成功開發海康DVR的關鍵了
HCNetSDK.cs里面IntPtr類型實際可以看成一個結構體的指針或者句柄(可以這么理解)
至於哪些方法int類型是對應結構體 可以看官方的SDK說明文檔 里面方法參數代表什么結構體說得很清楚
那些對應結構體的int參數 可以和結構體進行互相轉化 需要用一個C#類轉換:
IntPtr轉結構體 > Marshal.PtrToStructure
結構體轉IntPtr > Marshal.StructureToPtr
Marshal類在命名空間System.Runtime.InteropServices下
下面看些例子
1 /// <summary> 2 /// 用戶登錄設備。 3 /// </summary> 4 /// <param name="ip">設備IP地址</param> 5 /// <param name="port">設備端口號</param> 6 /// <param name="uname">登錄的用戶名 </param> 7 /// <param name="psw">用戶密碼</param> 8 /// <param name="dif">設備信息</param> 9 /// <returns>-1表示失敗,其他值表示返回的用戶ID值。該用戶ID具有唯一性,后續對設備的操作都需要通過此ID實現。</returns> 10 public static int DVRLogin(string ip, ushort port, string uname, string psw,ref CHCNetSDK.NET_DVR_DEVICEINFO dif) 11 { 12 return CHCNetSDK.NET_DVR_Login(ip, port, uname, psw, ref dif); 13 } 14 15 /// <summary> 16 /// 登出設備 17 /// </summary> 18 /// <param name="userID">用戶ID號,NET_DVR_Login或NET_DVR_Login_V30的返回值</param> 19 /// <returns>TRUE表示成功,FALSE表示失敗</returns> 20 public static bool DVRLogout(int userID) 21 { 22 return CHCNetSDK.NET_DVR_Logout(userID); 23 } 24 /// <summary> 25 /// 獲取DVR設備的名稱 26 /// </summary> 27 /// <param name="dif">設備信息</param> 28 /// <returns>DVR設備名稱</returns> 29 public static string GetDVRName(int lUserID) 30 { 31 IntPtr ip=new IntPtr(); 32 uint lpBytesReturned = 0; 33 CHCNetSDK.NET_DVR_DEVICECFG deviceInfo=new CHCNetSDK.NET_DVR_DEVICECFG(); 34 if (!CHCNetSDK.NET_DVR_GetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_GET_DEVICECFG, -1, ip,deviceInfo.dwSize, ref lpBytesReturned)) 35 { 36 return null; 37 } 38 Marshal.PtrToStructure(ip, deviceInfo); 39 return System.Text.Encoding.Default.GetString(deviceInfo.sDVRName); 40 } 41 /// <summary> 42 /// 設置DVR名稱 43 /// </summary> 44 /// <param name="dif">設備信息</param> 45 /// <param name="newDVRName">需要設置的DVR新名稱</param> 46 /// <returns>是否設置成功</returns> 47 public static bool SetDVRName(int lUserID, string newDVRName) 48 { 49 if (string.IsNullOrEmpty(newDVRName)) { 50 return false; 51 } 52 IntPtr ip=new IntPtr(); 53 uint lpBytesReturned = 0; 54 CHCNetSDK.NET_DVR_DEVICECFG deviceInfo = new CHCNetSDK.NET_DVR_DEVICECFG(); 55 if (!CHCNetSDK.NET_DVR_GetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_GET_DEVICECFG, -1, ip, deviceInfo.dwSize, ref lpBytesReturned)) 56 { 57 return false; 58 } 59 Marshal.PtrToStructure(ip, deviceInfo); 60 deviceInfo.sDVRName = System.Text.Encoding.Default.GetBytes(newDVRName); 61 Marshal.StructureToPtr(deviceInfo, ip, true); 62 return CHCNetSDK.NET_DVR_SetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_SET_DEVICECFG, -1, ip, deviceInfo.dwSize); 63 } 64 /// <summary> 65 /// 獲取DVR日志 66 /// </summary> 67 /// <param name="lUserID">NET_DVR_Login或NET_DVR_Login_V30的返回值</param> 68 /// <param name="searchMode">搜索模式設置</param> 69 /// <param name="logTopCount">日志數量</param> 70 /// <param name="startTime">開始時間</param> 71 /// <param name="endTime">結束時間</param> 72 /// <returns>結果集</returns> 73 public static IList<CHCNetSDK.NET_DVR_LOG> GetLog(int lUserID,int searchMode, int logTopCount,DateTime startTime,DateTime endTime) 74 { 75 IList<CHCNetSDK.NET_DVR_LOG> logs = new List<CHCNetSDK.NET_DVR_LOG>(); 76 CHCNetSDK.NET_DVR_TIME dvrStartTime, dvrEndTime; 77 dvrStartTime = new CHCNetSDK.NET_DVR_TIME() { dwYear = (uint)startTime.Year, dwMonth = (uint)startTime.Month, dwDay = (uint)startTime.Day, dwHour = (uint)startTime.Hour, dwMinute = (uint)startTime.Minute, dwSecond = (uint)startTime.Second }; 78 dvrEndTime=new CHCNetSDK.NET_DVR_TIME() { dwYear = (uint)endTime.Year, dwMonth = (uint)endTime.Month, dwDay = (uint)endTime.Day, dwHour = (uint)endTime.Hour, dwMinute = (uint)endTime.Minute, dwSecond = (uint)endTime.Second }; 79 int logFindHandle = CHCNetSDK.NET_DVR_FindDVRLog(lUserID, searchMode, 0, 0, ref dvrStartTime, ref dvrEndTime); 80 if (logFindHandle != -1) { 81 CHCNetSDK.NET_DVR_LOG log; 82 int findResult; 83 do 84 { 85 log = new CHCNetSDK.NET_DVR_LOG(); 86 findResult = CHCNetSDK.NET_DVR_FindNextLog(logFindHandle, ref log); 87 if (findResult == CHCNetSDK.NET_DVR_FILE_SUCCESS) 88 { 89 logs.Add(log); 90 } 91 } while (findResult != -1 && findResult != CHCNetSDK.NET_DVR_NOMOREFILE && logs.Count < logTopCount); 92 int closeCount = 3; 93 while (!CHCNetSDK.NET_DVR_FindLogClose(logFindHandle)) { 94 if (--closeCount < 0) { 95 break; 96 } 97 } 98 } 99 return logs; 100 }
上面的代碼可以編譯通過
但是功能上有沒有Bug無法現在測試(公司海康監控設備因為權限的原因而無法訪問)
如果以后弄好開放環境測試的時候 有需求修改的時候 再做更正。