有没高手用海康视频的视频服务器做视频监控的?我用的是 HCNetSDK.dll ,因为他的动态链接库是用C++开发的,要在C#使用,要先进行转换!
在透明通道部分说如果要把232串口作为透明通道使用,必须先在232串口的配置信息中将工作模式选择为透明通道
SDK设置的原函数是:BOOL NET_DVR_SetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel, 
LPVOID lpInBuffer,DWORD dwInBufferSize) 
设置硬盘录像机的参数 
参数说明
lUserID:NET_DVR_Login ()的返回值 
dwCommand:参数类型 (dwCommand=103的时候,是设置RS232串口)
lChannel:通道号,如果不是通道参数,lChannel 不用,置为0即可 
lpInBuffer:存放输入参数的缓冲区(设置RS232参数的结构) 
dwInBufferSize:缓冲区的大小 
返回值:TRUE 表示成功,FALSE 表示失败。 我是按下面的方式把它转为C#的 [DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetDVRConfig(int IUserID, uint dwCommand, int IChannel,System.UInt32 lpInBuffer, uint dwInBufferSize);问题是第三个参数,lpInBuffer应该指的是对应的设置232串口对应结构的指针!!但C#里不知道怎么取结构的地址?我的代码:                 //PPCFG(Rs232结构的一个参数)
                HC.SDK.NET_DVR_PPPCFG PPPCFG = new HC.SDK.NET_DVR_PPPCFG();
                PPPCFG .byDataEncrypt =(byte) 0;
                PPPCFG.byPPPMode = (byte)1;
                PPPCFG.byRedial = (byte)0;
                PPPCFG.byRedialMode = (byte)0;
                PPPCFG.dwMTU = (uint)0;
                PPPCFG.sLocalIP = "192.168.1.250";
                PPPCFG.sLocalIPMask = "0.0.0.0";
                PPPCFG.sUsername = StringToByte (Program .MySetting .UserName );
                PPPCFG.sPassword = StringToByte(Program.MySetting.PassWord);
                PPPCFG.sRemoteIP = Program.MySetting.ServerIP;
                PPPCFG.sTelephoneNumber = "12345678";
               
 
                //设置Rs232的结构
                HC.SDK.NET_DVR_RS232CFG Rs232 = new HC.SDK.NET_DVR_RS232CFG();
                Rs232.byDataBit = (byte)3;
                Rs232.byFlowcontrol = (byte)0;
                Rs232.byParity = (byte)0;
                Rs232.byStopBit = (byte)0;
                Rs232.dwBaudRate = (uint)14;
                Rs232.dwSize = (uint)24;
                Rs232.dwWorkMode = (uint)2;
                Rs232.struPPPConfig = PPPCFG;
                
                HC.SDK.HCNetSDK.NET_DVR_SetDVRConfig(Login, 113, 0, Rs232, (uint)100);
问题是NET_DVR_SetDVRConfig(Login, 113, 0, Rs232, (uint)100)的第三和第四个参数分别如何设置发帖最多只能给100分,明天再追加100分!!

解决方案 »

  1.   

    试试这个
    [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRConfig(int IUserID, uint dwCommand, IntPtr IChannel, System.UInt32 lpInBuffer, uint dwInBufferSize);
    GCHandle gch = GCHandle.Alloc(Rs232);
    HC.SDK.HCNetSDK.NET_DVR_SetDVRConfig(Login, 113, 0, GCHandle.ToIntPtr(gch), (uint)100);
    gch.Free();
      

  2.   

    直接传结构体也行,例如:这里是定义了一个结构体:
        /// <summary>
        /// 客户端的参数结构
        /// 说明:如果将m_bUserCheck置为FALSE,则把用户名和密码作为空指针发送到服务器。
        /// 虽然用户名和密码的内容不能超过50字节,但是用户名和密码缓冲区长度必须大于等于50,
        /// 因为内部操作的时候直接从用户名或密码缓冲区拷贝50字节到发送缓冲区里。
        /// </summary>
        public struct CLIENT_VIDEOINFO:Int32
        {
            /// <summary>
            /// 对应服务端的的通道号
            /// </summary>
            public byte m_bRemoteChannel;
            /// <summary>
            /// 网络连接方式
            /// </summary>
            public byte m_bSendMode;
            /// <summary>
            /// 图像格式,0为服务端主通道的图像 ;1为服务端子通道的图像
            /// </summary>
            public byte m_nImgFormat;  // =0 main channel ; = 1 sub channel
            /// <summary>
            /// 服务端的IP地址
            /// </summary>
            public string m_sIPAddress;
            /// <summary>
            /// 用户名
            /// </summary>
            public string m_sUserName;
            /// <summary>
            /// 密码
            /// </summary>
            public string m_sUserPassword;
            /// <summary>
            /// 是否需要发送用户名和密码
            /// </summary>
            public bool m_bUserCheck;
            /// <summary>
            /// 显示区域
            /// </summary>
            public System.IntPtr m_hShowVideo;
        };
    下面是使用:
            /// <summary>
            /// 启动客户端。
            /// </summary>
            /// <param name="pClientInfo">客户端的参数结构</param>
            /// <param name="callBack">来读取数据流回调函数</param>
            /// <returns>
            /// 返回-1表示失败,其他值表示成功。作为后续操作的参数。
            /// 注 :MP4_ClientStart返回成功,并不表示已经成功连接服务端。
            /// 您需要通过MP4_ClientGetState函数去获得网络连接的状态
            /// </returns>
            [DllImport("HikClient.dll")]
            public static extern int MP4_ClientStart(ref CLIENT_VIDEOINFO pClientInfo, ReadDataCallBack callBack);去年做的一个小项目中用到了海康的DS400卡
      

  3.   

    你用的是uint,就把结构体的类型搞成uintpublic struct CLIENT_VIDEOINFO:UInt32
    {
       ...
    }
      

  4.   

    谢谢,我先试下,对了,好久没来CSDN了,怎么好像不能加分的了
      

  5.   

    按你的方法定义结构体有错误啊!
    错误:接口列表中的类型“UInt32”不是接口
      

  6.   

    传说中的海康威视吧,做了好长时间那个,不过只做了些简单的,还是用c++ builder,无能为力喽……
      

  7.   


    Sorry,枚举才可以这样使用,不必加后面的了!
      

  8.   

    C++            C#
    =====================================
    WORD            ushort
    DWORD            uint
    UCHAR            int/byte  大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte
    UCHAR*            string/IntPtr
    unsigned char*        Intptr
    char*            string
    LPCTSTR            string
    LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
    long            int
    ulong              uint
    Handle            IntPtr
    HWND            IntPtr
    void*            IntPtr
    int            int
    int*            ref int
    *int            IntPtr
    unsigned int        uint
    COLORREF                uint 
    这个数据类型对照可能会用到
      

  9.   

    /// <summary>
        /// 客户端的参数结构
        /// 说明:如果将m_bUserCheck置为FALSE,则把用户名和密码作为空指针发送到服务器。
        /// 虽然用户名和密码的内容不能超过50字节,但是用户名和密码缓冲区长度必须大于等于50,
        /// 因为内部操作的时候直接从用户名或密码缓冲区拷贝50字节到发送缓冲区里。
        /// </summary>
        public struct CLIENT_VIDEOINFO
        {
            /// <summary>
            /// 对应服务端的的通道号
            /// </summary>
            public byte m_bRemoteChannel;
            /// <summary>
            /// 网络连接方式
            /// </summary>
            public byte m_bSendMode;
            /// <summary>
            /// 图像格式,0为服务端主通道的图像 ;1为服务端子通道的图像
            /// </summary>
            public byte m_nImgFormat;  // =0 main channel ; = 1 sub channel
            /// <summary>
            /// 服务端的IP地址
            /// </summary>
            public string m_sIPAddress;
            /// <summary>
            /// 用户名
            /// </summary>
            public string m_sUserName;
            /// <summary>
            /// 密码
            /// </summary>
            public string m_sUserPassword;
            /// <summary>
            /// 是否需要发送用户名和密码
            /// </summary>
            public bool m_bUserCheck;
            /// <summary>
            /// 显示区域
            /// </summary>
            public System.IntPtr m_hShowVideo;
        };
     /// <summary>
            /// 启动客户端。
            /// </summary>
            /// <param name="pClientInfo">客户端的参数结构</param>
            /// <param name="callBack">来读取数据流回调函数</param>
            /// <returns>
            /// 返回-1表示失败,其他值表示成功。作为后续操作的参数。
            /// 注 :MP4_ClientStart返回成功,并不表示已经成功连接服务端。
            /// 您需要通过MP4_ClientGetState函数去获得网络连接的状态
            /// </returns>
            [DllImport("HikClient.dll")]
            public static extern int MP4_ClientStart(ref CLIENT_VIDEOINFO pClientInfo, ReadDataCallBack callBack);
    这样既可,也就是某楼所说的,结构体前面加上ref既可!
      

  10.   

    但我的函数里面,要求的参数是int类型的,这样应该类型不对吧~!
    不过谢谢啦~!!