"无法封送处理“parameter #2”: 内部限制: 结构太复杂或太大。"

来源:互联网 发布:生孩子 知乎 编辑:程序博客网 时间:2024/05/01 08:50

原型

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




0 0
原创粉丝点击