海康的官方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无法现在测试(公司海康监控设备因为权限的原因而无法访问)
如果以后弄好开放环境测试的时候 有需求修改的时候 再做更正。