“无法封送处理“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)); 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

random_2011

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值