现有C++函数:
BOOL NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack  fMessageCallBack,void *pUser);这个函数传入的参数是回调函数:
Callback Function
typedef void(CALLBACK *MSGCallBack)(
  LONG               lCommand,
  NET_DVR_ALARMER    *pAlarmer,
  char               *pAlarmInfo,
  DWORD              dwBufLen,
  void               *pUser
);
而这个回调函数中的参数又有一个结构体:
struct{
  BYTE     byUserIDValid;
  BYTE     bySerialValid;
  BYTE     byVersionValid;
  BYTE     byDeviceNameValid;
  BYTE     byMacAddrValid;
  BYTE     byLinkPortValid;
  BYTE     byDeviceIPValid;
  BYTE     bySocketIPValid;
  LONG     lUserID;
  BYTE     sSerialNumber[SERIALNO_LEN];
  DWORD    dwDeviceVersion;
  char     sDeviceName[NAME_LEN];
  BYTE     byMacAddr[MACADDR_LEN];
  WORD     wLinkPort;
  char     sDeviceIP[128];
  char     sSocketIP[128];
  BYTE     byIpProtocol;
  BYTE     byRes2[11];
}NET_DVR_ALARMER,*LPNET_DVR_ALARMER;该怎么样翻译成C#语言的类?我自己做了一个回调不成功,请高手帮忙灰常感谢 public class DataSyncHelper
    {        //注册回调函数,接收设备报警消息等。
        [DllImport("HCNetSDK.dll", CharSet = CharSet.Ansi)]
         public static extern bool NET_DVR_SetDVRMessageCallBack_V30([MarshalAs(UnmanagedType.FunctionPtr)]MSGCallBack fMessageCallBack, IntPtr pUser);
     }
    //定义回调函数中的委托
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void MSGCallBack(long lCommand, ref  NET_DVR_ALARMER pAlarmer, string pAlarmInfo, int dwBufLen, IntPtr pUser);
    //回调函数的结构体
    [StructLayout(LayoutKind.Sequential)]  
    public struct NET_DVR_ALARMER
    {
        public byte byUserIDValid;                                  /* userid是否有效 0-无效,1-有效 */
        public byte bySerialValid;                                  /* 序列号是否有效 0-无效,1-有效 */
        public byte byVersionValid;                                  /* 版本号是否有效 0-无效,1-有效 */
        public byte byDeviceNameValid;                               /* 设备名字是否有效 0-无效,1-有效 */
        public byte byMacAddrValid;                                  /* MAC地址是否有效 0-无效,1-有效 */
        public byte byLinkPortValid;                                 /* login端口是否有效 0-无效,1-有效 */
        public byte byDeviceIPValid;                                 /* 设备IP是否有效 0-无效,1-有效 */
        public byte bySocketIPValid;                                 /* socket ip是否有效 0-无效,1-有效 */
        public long lUserID;                                        /* NET_DVR_Login()返回值, 布防时有效 */
        [MarshalAs(UnmanagedType.U8, SizeConst= 48)]
        public byte sSerialNumber;
        public uint dwDeviceVersion;                                /* 版本信息 高16位表示主版本,低16位表示次版本*/
        [MarshalAs(UnmanagedType.TBStr, SizeConst= 32)]
        public char sDeviceName;                              /* 设备名字 */
        [MarshalAs(UnmanagedType.U8, SizeConst= 16)]
        public byte byMacAddr;                                /* MAC地址 */
        public int wLinkPort;                                      /* link port */
        [MarshalAs(UnmanagedType.TBStr, SizeConst= 128)]
        public char sDeviceIP;                         /* IP地址 */
        [MarshalAs(UnmanagedType.TBStr, SizeConst= 128)]
        public char sSocketIP;                         /* 报警主动上传时的socket IP地址 */
        public byte byIpProtocol;                                   /* Ip协议 0-IPV4, 1-IPV6 */
        [MarshalAs(UnmanagedType.U8, SizeConst= 11)]
        public byte byRes2;
    }
调用时时:
        static  System.IntPtr intptr = IntPtr.Zero;
        //委托类型变量
        static  MSGCallBack AsyncCallback = null;
    
        static void Main(string[] args)
        {
                AsyncCallback = AsyncCallbackSend;
         
                // 注册回调函数,接收设备报警消息等。
                bool back = DataSyncHelper.NET_DVR_SetDVRMessageCallBack_V30(AsyncCallback, intptr);         }        static void AsyncCallbackSend(long lCommand, ref NET_DVR_ALARMER pAlarmer, string pAlarmInfo, int dwBufLen, IntPtr pUser)
        {
            Console.WriteLine("AAA");
        }
一直不能调试一直不能打印AAA,本人用的C++做的可以成功但到C#里面就。高人指点。。

解决方案 »

  1.   


    将设置报警回调函数NET_DVR_SetDVRMessageCallBack_V30和NET_DVR_StartListen_V30的最后一个参数明确。 //最后一个参数原来为 IntPtr pUser  改为 ref int pUser);   //IntPtr pUser);
     [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, ref int pUser);     //启动监听,接收设备主动上传的报警等信息(支持多线程)。
        [DllImport("HCNetSDK.dll")]
        public static extern int NET_DVR_StartListen_V30(string sLocalIP, ushort wLocalPort, MSGCallBack DataCallback, ref int pUserData); //回调函数       
        public delegate void MSGCallBack(int lCommand, ref NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, ref int pUser);   //IntPtr pUser); NET_DVR_StartListen_V30
    定义一个VIDEO类,public class VIDEO
        {           .............           public int m_lUserID = -1;           private static CHCNetSDK.MSGCallBack MsgBack;           ........           public void Login()
              {                  //设备注册CHCNetSDK.NET_DVR_Login_V30(........)          }          //启动监听报警
            public void StartListen()
            {            //设置报警回调函数
                MsgBack = new CHCNetSDK.MSGCallBack(msgCallBack);         //回调函数实例化
                CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(MsgBack, ref m_lUserID);            //开始监听   //监控报警信息线程 
                Thread myAlarmThread = new Thread(new ThreadStart(ListenAlarmThreadProc));
                myAlarmThread.Priority = ThreadPriority.Lowest;
                myAlarmThread.Start();
            }        //监听报警线程函数
            private void ListenAlarmThreadProc()
            {
                string sLocalIP = GetIP();   //***PC机本地IP地址,设备中服务器参数:“管理主机IP地址”,必须和此处一致
                ushort wLocalPort = 8001;    //***PC本地监听端口号。由用户设置,必须和设备中服务器参数:“管理主机端口号”一致           //CHCNetSDK.MSGCallBack MsgBack = new CHCNetSDK.MSGCallBack(msgCallBack);         //回调函数实例化
                CHCNetSDK.NET_DVR_StartListen_V30(sLocalIP, wLocalPort, MsgBack, ref m_lUserID);
            }        //报警回调函数
            private void msgCallBack(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, ref int pUser)
            {                   //报警发生时你要执行的操作                   ................         } 调用:private VIDEO video;...........video.Login();    //注册设备 video.StartListen();   //启动监听报警