求c++结构体转c#问题

syxsyx7 2011-05-09 12:01:12
c++结构定义:如下

#define BYTE unsigned char

typedef struct __DEV_ENCODER_INFO
{
char szDevIp[DH_MAX_IPADDR_LEN]; // 前端DVR的IP地址
WORD wDevPort; // 前端DVR的端口号
BYTE bDevChnEnable; // 解码通道使能
BYTE byEncoderID; // 对应解码通道号
char szDevUser[DH_USER_NAME_LENGTH_EX]; // 用户名
char szDevPwd[DH_USER_PSW_LENGTH_EX]; // 密码
int nDevChannel; // 通道号
int nStreamType; // 码流类型,0:主码流;1:子码流; 2:snap
BYTE byConnType; // 0:TCP;1:UDP;2:组播
BYTE byWorkMode; // 0:直连;1:转发
WORD wListenPort; // 指示侦听服务的端口,转发时有效
DWORD dwProtoType; // 协议类型,
// 0:兼容以前
// 1:大华二代协议
// 2:大华系统集成协议
// 3:大华DSS协议
// 4:大华rtsp协议
char szDevName[64]; // 前端设备名称
BYTE byVideoInType; // 该解码通道当前视频源类型:0-标清(SD),1-高清(HD),注:设备支持高清通道才有效
char szDevIpEx[DH_MAX_CLIENT_SwitchDecTVEncoderIPADDR_OR_DOMAIN_LEN];// szDevIp扩展,前端DVR的IP地址(可以输入域名)
BYTE bySnapMode; //抓图模式(nStreamType==2时有效) 0:表示请求一帧,1:表示定时发送请求
BYTE byManuFactory; //目标设备的生产厂商,0:Private(大华私有)
BYTE byDeviceType; //目标设备的设备类型,0:IPC
char reserved[48];
} DEV_ENCODER_INFO, *LPDEV_ENCODER_INFO;

转换后c#代码为:

[StructLayout(LayoutKind.Sequential)]
public struct DEV_ENCODER_INFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szDevIp; // 前端DVR的IP地址
public ushort wDevPort;// 前端DVR的端口号
public bool bDevChnEnable;// 解码通道使能
public byte byEncoderID;// 对应解码通道号
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szDevUser;// 用户名
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szDevPwd;// 密码
public byte nDevChannel;// 通道号
public byte nStreamType;// 码流类型,0:主码流;1:子码流; 2:snap
public byte byConnType;// 0:TCP;1:UDP;2:组播
public byte byWorkMode;// 0:直连;1:转发
public ushort wListenPort;// 指示侦听服务的端口,转发时有效
public uint dwProtoType;// 协议类型,
// 0:兼容以前
// 1:大华二代协议
// 2:大华系统集成协议
// 3:大华DSS协议
// 4:大华rtsp协议
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string szDevName;// 前端设备名称
public byte byVideoInType;// 该解码通道当前视频源类型:0-标清(SD),1-高清(HD),注:设备支持高清通道才有效
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string szDevIpEx;// szDevIp扩展,前端DVR的IP地址(可以输入域名)
public byte bySnapMode; //抓图模式(nStreamType==2时有效) 0:表示请求一帧,1:表示定时发送请求
public byte byManuFactory;//目标设备的生产厂商,0:Private(大华私有)
public byte byDeviceType;//目标设备的设备类型,0:IPC
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)]
public string reserved;
}

调用dll方法使用该结构体时,使用out 参数获取该结构体时没有问题.
在c#应用程序中赋值时
szDevIp 出错;错误为 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
其他字段都没有问题.
求解;或熟悉类型转换的高手 给写个C#结构
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
月光小提琴 2012-11-24
  • 打赏
  • 举报
回复
那就用byte[] szDevIp = new byte[16];
syxsyx7 2011-05-10
  • 打赏
  • 举报
回复
顶一下 , 求解决办法或者响应的思路
kingdom_0 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 syxsyx7 的回复:]

c++中定义szDevIp长度为16
[/Quote]Object类型
syxsyx7 2011-05-09
  • 打赏
  • 举报
回复
来个高手呗 。 给点建议也成
syxsyx7 2011-05-09
  • 打赏
  • 举报
回复
c++中定义szDevIp长度为16
请叫我卷福 2011-05-09
  • 打赏
  • 举报
回复
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]

szDevIp太长了
liyangfd 2011-05-09
  • 打赏
  • 举报
回复
你在C++中看下 这个类占多少个字节
然后再C#中看看占多少个字节
看看哪个变量转换时候出错了
这个错误一般都是字节大小不对导致的
请叫我卷福 2011-05-09
  • 打赏
  • 举报
回复
哇靠 你 szDevUser szDevPwd 怎么没出错?

是不是你数据有问题啊
请叫我卷福 2011-05-09
  • 打赏
  • 举报
回复
试一下 StringBuilder 类型

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧