你先把C++里的这个结构体:NET_DVR_PICCFG_V30,以及它里面的NET_DVR_COLOR,NET_DVR_SHELTER贴出来看看!还有在C#这边定义对应的结构体都贴出来!最后,也把DVR_GetDVRConfig在C++的定义原型,C#的映射函数定义都贴出来

解决方案 »

  1.   

    OK     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
        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
    是这样的,望大牛们解答
      

  2.   

    建议你和同事商讨。至少存在几个问题:
    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, out uint dwOutBufferSize, out uint lpBytesReturned);3、可能可以直接传递ref NET_DVR_PICCFG_V30 lpOutBuffer,而不用麻烦Marshal.PtrToStructure
      

  3.   

    这样转换:public struct NET_DVR_MOTION_V30
    {
        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[];         /* 报警触发的录象通道*/
    };
      

  4.   


           [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;
            }
      

  5.   


       [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 数组,本来就从函数的输出参数获取到了,干嘛还有转来转去啊,纯属多余!
      

  6.   

    都没有来回答的
    @sdl2005lyx 这位兄台让我把分数提高到100,还是没有人来帮我解决。最后我自己解决了。
    6楼挺中肯的,还有@sdl2005lyx挺热心,回答了这么多,要点分数也不容了,虽然没回答到点子上。