原型
[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));