我想将原型为:#define NAME_LEN 32
#define SERIALNO_LEN 48
#define MAX_CHANNUM 16
typedef struct {
BYTE sSerialNumber[SERIALNO_LEN]; //保留
BYTE byAlarmInPortNum; //DVR报警输入个数
BYTE byAlarmOutPortNum; //DVR报警输出个数
BYTE byDiskNum; //DVR 硬盘个数
BYTE byDVRType; //DVR类型, 1:DVR 2:ATM DVR 3:DVS (建议使用HB_SDVR_GetDeviceType)
BYTE byChanNum; //DVR 通道个数
BYTE byStartChan; //保留
BYTE sDvrName[NAME_LEN]; //主机名
BYTE sChanName[MAX_CHANNUM][NAME_LEN]; //通道名称
}HB_SDVR_DEVICEINFO, *LPHB_SDVR_DEVICEINFO;转为C#代码 [StructLayout(LayoutKind.Sequential)]
public struct HB_SDVR_DEVICEINFO
{
/// <summary>
/// 序列号
/// public byte sSerialNumber[SERIALNO_LEN];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN)]
public byte[] sSerialNumber;//保留
public byte byAlarmInPortNum;//DVR报警输入个数
public byte byAlarmOutPortNum;//DVR报警输出个数
public byte byDiskNum;//DVR 硬盘个数
public byte byDVRType;//DVR类型, 1:DVR 2:ATM DVR 3:DVS (建议使用HB_SDVR_GetDeviceType)
public byte byChanNum;//DVR 通道个数
public byte byStartChan;//保留
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN)]
public byte[] sDvrName;//主机名
[???]
public byte[] sChanName;//通道名称
} sChanName[???]这里我该如何标识!??大虾出来帮下忙,不胜感激!!
#define SERIALNO_LEN 48
#define MAX_CHANNUM 16
typedef struct {
BYTE sSerialNumber[SERIALNO_LEN]; //保留
BYTE byAlarmInPortNum; //DVR报警输入个数
BYTE byAlarmOutPortNum; //DVR报警输出个数
BYTE byDiskNum; //DVR 硬盘个数
BYTE byDVRType; //DVR类型, 1:DVR 2:ATM DVR 3:DVS (建议使用HB_SDVR_GetDeviceType)
BYTE byChanNum; //DVR 通道个数
BYTE byStartChan; //保留
BYTE sDvrName[NAME_LEN]; //主机名
BYTE sChanName[MAX_CHANNUM][NAME_LEN]; //通道名称
}HB_SDVR_DEVICEINFO, *LPHB_SDVR_DEVICEINFO;转为C#代码 [StructLayout(LayoutKind.Sequential)]
public struct HB_SDVR_DEVICEINFO
{
/// <summary>
/// 序列号
/// public byte sSerialNumber[SERIALNO_LEN];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN)]
public byte[] sSerialNumber;//保留
public byte byAlarmInPortNum;//DVR报警输入个数
public byte byAlarmOutPortNum;//DVR报警输出个数
public byte byDiskNum;//DVR 硬盘个数
public byte byDVRType;//DVR类型, 1:DVR 2:ATM DVR 3:DVS (建议使用HB_SDVR_GetDeviceType)
public byte byChanNum;//DVR 通道个数
public byte byStartChan;//保留
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN)]
public byte[] sDvrName;//主机名
[???]
public byte[] sChanName;//通道名称
} sChanName[???]这里我该如何标识!??大虾出来帮下忙,不胜感激!!
[StructLayout(LayoutKind.Sequential)]
public struct HB_SDVR_DEVICEINFO
{
/// <summary>
/// 序列号
/// public byte sSerialNumber[SERIALNO_LEN];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN)]
public byte[] sSerialNumber;//保留
public byte byAlarmInPortNum;//DVR报警输入个数
public byte byAlarmOutPortNum;//DVR报警输出个数
public byte byDiskNum;//DVR 硬盘个数
public byte byDVRType;//DVR类型, 1:DVR 2:ATM DVR 3:DVS (建议使用HB_SDVR_GetDeviceType)
public byte byChanNum;//DVR 通道个数
public byte byStartChan;//保留
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN)]
public byte[] sDvrName;//主机名
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN * MAX_CHANNUM)]
public byte[] sChanName;//通道名称
}??这样么?
还请教一下,
C++原型为: HB_SDVR_API LONG __stdcall HB_SDVR_Login(char *sDVRIP,WORD wDVRPort,char *sUserName,char *sPassword,LPHB_SDVR_DEVICEINFO lpDeviceInfo);
我转为C#后为: [DllImport(SdkDllFile)]
public static extern int HB_SDVR_Login(string sDVRIP, ushort wDVRPort, string sUserName, string sPassword, out HB_SDVR_DEVICEINFO lpDeviceInfo);我调用该方法后提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的错误!
是不是我转换的类型不对!!??
我就在想二维数据转为NAME_LEN * MAX_CHANNUM,我原来这么写过,但还是出错。