修改海康摄像头设备显示名称显示未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配,下面是我的代码。
CHCNetSDK.NET_DVR_PICCFG config = new CHCNetSDK.NET_DVR_PICCFG();
config.sChanName = System.Text.Encoding.UTF8.GetBytes("海康摄像头");
int size = Marshal.SizeOf(config);
int lChannel = 0x001;
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(config, ptr, true);
Boolean res = CHCNetSDK.NET_DVR_SetDVRConfig(this.UserId,
CHCNetSDK.NET_DVR_SET_PICCFG, lChannel, ptr, (uint)size);
if (!res) {
uint err = CHCNetSDK.NET_DVR_GetLastError();
Console.WriteLine("error code is {0}", err);
}
Marshal.FreeHGlobal(ptr);
其实错误是
config.sChanName = System.Text.Encoding.UTF8.GetBytes("海康摄像头");
这句代码写错了,由于C语言字符串的特性,config.sChanName 是是个固定长度的字符数组,属性的定义如下
public struct NET_DVR_PICCFG {
public uint dwSize;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)]
public byte[] sChanName;
}
其中SizeConst = NAME_LEN 这里标注了这个数组的长度,这里长度是定义的是32个字符,如下图。
所以正确的写法应该是
config.sChanName = new byte[CHCNetSDK.NAME_LEN];//这里定义的长度一定要跟属性指定的属性长度一致
Encoding.UTF8.GetBytes("海康摄像头").CopyTo(config.sChanName,0);