"無法封送處理“parameter #2”: 內部限制: 結構太複雜或太大。"

原型

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章