你先把C++里的这个结构体:NET_DVR_PICCFG_V30,以及它里面的NET_DVR_COLOR,NET_DVR_SHELTER贴出来看看!还有在C#这边定义对应的结构体都贴出来!最后,也把DVR_GetDVRConfig在C++的定义原型,C#的映射函数定义都贴出来
解决方案 »
- StringBuilder删除数据应该怎么写?
- C#代码求改错
- c# winform做登陆窗体问题
- 简单openFileDialog问题。
- 在线打分!!!!窗体的启动??
- 郁闷,100 分 问个名词解释
- **************向高手问一个在C#里如何访问局域网中的数据库,即数据库共享访问的问题*******
- 请教: checkedListBox 多选取值的问题!!
- sqlserver存儲過程問題,高手請進,在線等!!!!!!!!!!
- 我想在把2个表填充到DATAGRID 但是这段代码有什么错吗? 各位大哥进来看看 谢谢
- 关于Timer的问题
- 求助 关于SendMessage和WM_SETTEXT的问题
public struct NET_DVR_MOTION_V30
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64*96)]
public byte[] byMotionScope;
public byte byMotionSensitive;
public byte byEnableHandleMotion;
public byte byPrecision;
public char reservedData;
public NET_DVR_HANDLEEXCEPTION_V30 struMotionHandleType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Hik_HCNetSDK.MAX_DAYS * Hik_HCNetSDK.MAX_TIMESEGMENT)]
public NET_DVR_SCHEDTIME[] struAlarmTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Hik_HCNetSDK.MAX_CHANNUM_V30)]
public byte[] byRelRecordChan;
}这个是NET_DVR_MOTION_V30的结构体。其他结构体定于跟它是类似的,可以说是一样的。
然后这两个结构的在c++中的定义是typedef struct
{
DWORD dwSize;
BYTE sChanName[NAME_LEN];
DWORD dwVideoFormat; /* 只读 视频制式 1-NTSC 2-PAL*/
NET_DVR_COLOR struColor;// 图像参数
char reservedData [60];/*保留*/
//显示通道名
DWORD dwShowChanName; // 预览的图象上是否显示通道名称,0-不显示,1-显示 区域大小704*576
WORD wShowNameTopLeftX; /* 通道名称显示位置的x坐标 */
WORD wShowNameTopLeftY; /* 通道名称显示位置的y坐标 */
//视频信号丢失报警
NET_DVR_VILOST_V30 struVILost;
NET_DVR_VILOST_V30 struRes; /*保留*/
//移动侦测
NET_DVR_MOTION_V30 struMotion;
//遮挡报警
NET_DVR_HIDEALARM_V30 struHideAlarm;
//遮挡 区域大小704*576
DWORD dwEnableHide; /* 是否启动遮挡 ,0-否,1-是*/
NET_DVR_SHELTER struShelter[MAX_SHELTERNUM];
//OSD
DWORD dwShowOsd;// 预览的图象上是否显示OSD,0-不显示,1-显示 区域大小704*576
WORD wOSDTopLeftX; /* OSD的x坐标 */
WORD wOSDTopLeftY; /* OSD的y坐标 */
BYTE byOSDType; /* OSD类型(主要是年月日格式) */
/* 0: XXXX-XX-XX 年月日 */
/* 1: XX-XX-XXXX 月日年 */
/* 2: XXXX年XX月XX日 */
/* 3: XX月XX日XXXX年 */
/* 4: XX-XX-XXXX 日月年*/
/* 5: XX日XX月XXXX年 */
BYTE byDispWeek; /* 是否显示星期 */
BYTE byOSDAttrib; /* OSD属性:透明,闪烁 */
/* 0: 不显示OSD */
/* 1: 透明,闪烁 */
/* 2: 透明,不闪烁 */
/* 3: 闪烁,不透明 */
/* 4: 不透明,不闪烁 */
BYTE byHourOSDType; /* OSD小时制:0-24小时制,1-12小时制 */
BYTE byRes[64];
}NET_DVR_PICCFG_V30, *LPNET_DVR_PICCFG_V30;typedef struct
{
BYTE byMotionScope[64][96]; /*侦测区域,0-96位,表示64行,共有96*64个小宏块,为1表示是移动侦测区域,0-表示不是*/
BYTE byMotionSensitive; /*移动侦测灵敏度, 0 - 5,越高越灵敏,oxff关闭*/
BYTE byEnableHandleMotion; /* 是否处理移动侦测 0-否 1-是*/
BYTE byRes; /* 保留 */
char reservedData;
NET_DVR_HANDLEEXCEPTION_V30 struMotionHandleType; /* 处理方式 */
NET_DVR_SCHEDTIME struAlarmTime[MAX_DAYS][MAX_TIMESEGMENT_V30]; /*布防时间*/
BYTE byRelRecordChan[MAX_CHANNUM_V30]; /* 报警触发的录象通道*/
}NET_DVR_MOTION_V30, *LPNET_DVR_MOTION_V30;
DVR_GetDVRConfig
在C#中的定义是 public bool DVR_GetDVRConfig(uint dwCommand, int lChannel, byte[] lpOutBuffer, out uint dwOutBufferSize, out uint lpBytesReturned)
{
return NET_DVR_GetDVRConfig(UserID, dwCommand, lChannel, lpOutBuffer, out dwOutBufferSize, out lpBytesReturned);
} [DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, byte[] lpOutBuffer, out uint dwOutBufferSize, out uint lpBytesReturned);其c++中定义原型是NET_DVR_API BOOL __stdcall NET_DVR_GetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel, LPVOID lpOutBuffer, DWORD dwOutBufferSize, LPDWORD lpBytesReturned);
@sdl2005lyx
是这样的,望大牛们解答
1、reservedData的声明一定有问题:
public struct NET_DVR_PICCFG_V30
{
...
public string reservedData;
...
}2、dwOutBufferSize是一个数字,不可以是指针
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand,
int lChannel, byte[] lpOutBuffer,
outuint dwOutBufferSize, out uint lpBytesReturned);3、可能可以直接传递ref NET_DVR_PICCFG_V30 lpOutBuffer,而不用麻烦Marshal.PtrToStructure{
public IntPtr byMotionScope; //这里要换成指针
public byte byMotionSensitive; /*移动侦测灵敏度, 0 - 5,越高越灵敏,oxff关闭*/
public byte byEnableHandleMotion; /* 是否处理移动侦测 0-否 1-是*/
public byte byRes; /* 保留 */
public char reservedData;
public NET_DVR_HANDLEEXCEPTION_V30 struMotionHandleType; //这里有个结构体,你要定义
public IntPtr struAlarmTime; //这里有个结构体,你要定义
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30)]
public byte byRelRecordChan[]; /* 报警触发的录象通道*/
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct NET_DVR_PICCFG_V30
{
public uint dwSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Hik_HCNetSDK.NAME_LEN)]
public byte[] sChanName; //这里有点怪怪的,C++那边用char数组更合理。 public uint dwVideoFormat;
public NET_DVR_COLOR struColor;
MarshalAs(UnmanagedType.ByValTStr, SizeConst = 60)]
public string reservedData; //这里感觉C++那边用byte数组更合理。 public uint dwShowChanName;
public ushort wShowNameTopLeftX;
public ushort wShowNameTopLeftY; public NET_DVR_VILOST_V30 struVILost;
public NET_DVR_VILOST_V30 struRes;
public NET_DVR_MOTION_V30 struMotion;
public NET_DVR_HIDEALARM_V30 struHideAlarm; public uint dwEnableHide;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Hik_HCNetSDK.MAX_SHELTERNUM)]
public NET_DVR_SHELTER[] struShelter; public uint dwShowOsd;
public ushort wOSDTopLeftX;
public ushort wOSDTopLeftY; public byte byOSDType;
public byte byDispWeek;
public byte byOSDAttrib;
public byte byHourOSDType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] byRes;
}
[DllImport("HCNetSDK.dll",CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]
[return : MarshalAs( UnmanagedType.Bool)] //4 字节布尔值(true != 0、false = 0)。这是 Win32 BOOL 类型。
public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, [In,Out]byte[] lpOutBuffer, uint dwOutBufferSize, ref uint lpBytesReturned);另外,你的那个调用也有问题:你那个bPicCfg 数组,本来就从函数的输出参数获取到了,干嘛还有转来转去啊,纯属多余!
@sdl2005lyx 这位兄台让我把分数提高到100,还是没有人来帮我解决。最后我自己解决了。
6楼挺中肯的,还有@sdl2005lyx挺热心,回答了这么多,要点分数也不容了,虽然没回答到点子上。