原型
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_DVR_SADPINFO
{
NET_DVR_IPADDR struIP;
ushort wPort;
ushort wFactoryType;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 48, ArraySubType = UnmanagedType.I1)]
byte[] chSoftwareVersion;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.I1)]
byte[] chSerialNo;
ushort wEncCnt;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MACADDR_LEN, ArraySubType = UnmanagedType.I1)]
byte[] byMACAddr;
NET_DVR_IPADDR struSubDVRIPMask;
NET_DVR_IPADDR struGatewayIpAddr;
NET_DVR_IPADDR struDnsServer1IpAddr;
NET_DVR_IPADDR struDnsServer2IpAddr;
byte byDns;
byte byDhcp;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 158, ArraySubType = UnmanagedType.I1)]
byte[] byRes;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_DVR_SADPINFO_LIST
{
uint dwSize;
ushort wSadpNum;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)]
public byte[] byRes;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_SADP_NUM, ArraySubType = UnmanagedType.Struct)]
NET_DVR_SADPINFO[] struSadpInfo;
}
[DllImportAttribute("HCNetSDK.dll")]
public static extern bool NET_DVR_GetSadpInfoList(int iLogHandle, ref NET_DVR_SADPINFO_LIST sadpinfolist);
调试总是报"无法封送处理“parameter #2”: 内部限制: 结构太复杂或太大。"看来应该是C#内部有限制(.NET .3.5). ref方式不行,那就用IntPtr指针方式了,如下:
[DllImportAttribute("HCNetSDK.dll")]
public static extern bool NET_DVR_GetSadpInfoList(int iLogHandle, IntPtr groupVal);
调用方式:
CHCNetSDK.NET_DVR_SADPINFO_LIST list = new CHCNetSDK.NET_DVR_SADPINFO_LIST();
IntPtr ptr = IntPtr.Zero;
int size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_SADPINFO_LIST));
ptr = Marshal.AllocHGlobal(size); // 为指针分配空间
bool ret = CHCNetSDK.NET_DVR_GetSadpInfoList(m_lUserID, ptr);
// 强制转化成原类型
list = (CHCNetSDK.NET_DVR_SADPINFO_LIST)Marshal.PtrToStructure(ptr, typeof(CHCNetSDK.NET_DVR_SADPINFO_LIST));