c++结构定义:如下#define BYTE unsigned chartypedef 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#结构
{
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#结构
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货