关于回调函数怎样改写成c#:
BOOL NET_DVR_SetDVRMessageCallBack_V30(
  MSGCallBack    fMessageCallBack,
  void           *pUser
);其中:fMessageCallBack 是 回调函数 typedef void(CALLBACK *MSGCallBack)(
  LONG               lCommand,
  NET_DVR_ALARMER    *pAlarmer,
  char               *pAlarmInfo,
  DWORD              dwBufLen,
  void               *pUser
);

解决方案 »

  1.   

    delegate void MSGCallBackEventHandler
      

  2.   

    已经定义成了:public delegate bool MessCallBack(int lCommand,string sDVRIP,string pBuf,uint dwBuflen)但调用不起作用
      

  3.   

    改为:public delegate bool MessCallBack(int lCommand,NET_DVR_ALARMER pAlarmer,string pAlarmInfo,uint dwBuflen,int pUser)依然有问题
      

  4.   

    有点乱。整理一下格式:
    VC的函数声明:
    ....
    C#下的声明:
    ....
    c#下的调用:
    .....并且代码用标注起来。
      

  5.   

    void *pUser
    这个参数怎么解释呀?那个帮忙回答一下
      

  6.   

    void *pUser
    无类型的指针
      

  7.   

    void *pUser 在C#该怎样定义?
      

  8.   

    C#中的委托。
    楼主要把问题描述清楚,如wuyazhe所说的。这样才好解答。
      

  9.   

    谢谢各位.是这样的:此函数是海康sdk里的,原是用其所长C++写的,NET_DVR_SetDVRMessageCallBack_V30注册回调函数,接收设备报警消息等。BOOL NET_DVR_SetDVRMessageCallBack_V30(
      MSGCallBack    fMessageCallBack,
      void           *pUser
    );
    Parameters
    fMessageCallBack 
    [in] 回调函数 
    pUser 
    [in] 用户数据 Callback Function
    typedef void(CALLBACK *MSGCallBack)(
      LONG               lCommand,
      NET_DVR_ALARMER    *pAlarmer,
      char               *pAlarmInfo,
      DWORD              dwBufLen,
      void               *pUser
    );Callback Function Parameters
    lCommand 
    上传的消息类型,见下表 宏定义 宏定义值 含义 
    COMM_ALARM 0x1100 V3.0以下版本支持的设备的报警信息上传 
    COMM_ALARM_RULE 0x1102 行为分析信息上传 
    COMM_TRADEINFO 0x1500 ATM DVR交易信息上传 
    COMM_ALARM_V30 0x4000 V3.0以上版本支持的设备的报警信息上传 
    COMM_IPCCFG 0x4001 混合型DVR在IPC接入配置改变时的报警信息上传 
    COMM_IPCCFG_V31 0x4002 混合型DVR在IPC接入配置改变时的报警信息上传(扩展) pAlarmer 
    报警设备信息 
    pAlarmInfo 
    报警信息 
    dwBufLen 
    报警信息缓存大小 
    pUser 
    用户数据 
    Return Values
    TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastErrorRes
    该接口中回调函数的第一个参数(lCommand)和第三个参数(pAlarmInfo)是密切关联的,其关系见下表: 消息类型(lCommand) 上传内容 pAlarmInfo对应的结构体 
    COMM_ALARM V3.0以下版本支持的设备的报警信息 NET_DVR_ALARMINFO 
    COMM_ALARM_RULE 行为分析信息 NET_VCA_RULE_ALARM 
    COMM_TRADEINFO ATM DVR交易信息 NET_DVR_TRADEINFO 
    COMM_ALARM_V30 V3.0以上版本支持的设备的报警信息 NET_DVR_ALARMINFO_V30 
    COMM_IPCCFG 混合型DVR在IPC接入配置改变时的报警信息 NET_DVR_IPALARMINFO 
    COMM_IPCCFG_V31 混合型DVR在IPC接入配置改变时的报警信息(扩展) NET_DVR_IPALARMINFO 
    现在的问题是不知怎样改写成c#
      

  10.   

    用AJAX去调写在C#中的函数就可以了吧?
      

  11.   

    很简单的一个结构Callback Function
    typedef void(CALLBACK *MSGCallBack)(
      LONG lCommand,
      NET_DVR_ALARMER *pAlarmer,
      char *pAlarmInfo,
      DWORD dwBufLen,
      void *pUser
    );
    你需要首先声明
    NET_DVR_ALARMER
    结构体
    LONG->long
    char*->StringBuilder
    DWORD->uint
    void*这个要看看实际对应是什么。
      

  12.   

    public class User
    {
       ....你定义
    }
    public class NET_DVR_ALARMER
    {
       ....你定义
    }public delegate MSGCallBackDelegate(long lCommand,ref NET_DVR_ALARMER pAlarmer,StringBuilder pAlarmInfo,uint dwBufferLen,ref User puser);在声明一个这样签名的方法
    public MSGCallBackMethod(long lCommand,ref NET_DVR_ALARMER pAlarmer,StringBuilder pAlarmInfo,uint dwBufferLen,ref User puser)
    {
        ......
    }
    定义一个成员字段:MSGCallBackDelegate MSGCallBack;调用
    MSGCallBack = new MSGCallBack(MSGCallBackMethod);
    调用时候用这个MSGCallBack
      

  13.   

    BOOL NET_DVR_SetDVRMessageCallBack_V30(
      MSGCallBack fMessageCallBack,
      void *pUser
    );BOOL NET_DVR_SetDVRMessageCallBack_V30(
      in MSGCallBack fMessageCallBack,
      in IntPtr pUser
    );
    Callback Function
    typedef void(CALLBACK *MSGCallBack)(
      LONG lCommand,
      NET_DVR_ALARMER *pAlarmer,
      char *pAlarmInfo,
      DWORD dwBufLen,
      void *pUser
    );
     delegate void MSGCallBack(
      Int64 lCommand,
      ref NET_DVR_ALARMER pAlarmer,
      string pAlarmInfo,
      Int32 dwBufLen,
      IntPtr pUser
    );
      

  14.   

    同理,请问转成vb.net怎么转,谢谢!
      

  15.   

    请高手帮忙看看这段C#调用dll的回调函数的代码为什么运行C#程序总是提示写入受保护的内存,是不是哪个数据类型写错了,在线等待
    /**********************************vc++**********************************************/
    typedef struct VIDEO_INFO
    {
    int nVideoWidth;/**< 像素宽度 */
    int nVideoHeight;/**< 像素高度 */
    int nVideoFPS;/**< 每秒多少帧 */
    unsigned char data[58];/**< 解码信息头 */
    DWORD dataSize;/**< 解码信息头长度 */
    struct timeval presentationTime;/**< 解码信息头时间戳 */
    }VIDEO_INFO;
    /** @brief 报警信息结构体 */
    typedef struct MSG_INFO 
    {
    char ip[16];/**< 报警设备IP */
    long object_id;/**< 对象ID */
    long rule_name;/**< 参考枚举 Rule_name */
    long rule_id;/**< 规则ID */
    double rel_center_x;
    double rel_center_y;
    double rel_dimension_x;
    double rel_dimension_y;
    double rel_velocity_x;
    double rel_velocity_y;
    long preset_id;
    double direction;
    double time_in_rule;
    double range;
    }MSG_INFO;
    typedef void (CALLBACK *MSGCallBack)(LONG lCommand,LONG nID,int nCh, char *pAlarmInfo, DWORD dwBufLen, void* Context);//报警回调函数
    /**
    * @brief 视频流回调函数
    * @param nStreamID 视频流的索引ID,AIIVS_OpenStream返回的
    * @param nID 设备索引ID,AIIVS_Connect返回的
    * @param nCh 设备的通道号
    * @param pBuffer 视频流帧数据
    * @param dwBufSize 帧数据长度
    * @param presentationTime 此帧时间戳
    * @param RealDataCallBackContext AIIVS_OpenStream时候 RealDataCallBackContext传进的值
    * @return 无返回值
    */
    typedef void (CALLBACK *fRealDataCallBack) (LONG nStreamID,LONG nID, int nCh, const unsigned char *pBuffer, DWORD dwBufSize,struct timeval presentationTime, void* RealDataCallBackContext);//视频流回调AIIVS_API void __stdcall AIIVS_Init();//初始化SDKAIIVS_API LONG __stdcall AIIVS_Connect(char * sIp, int nPort , char * sName , char * sPwd ,MSGCallBack pMsgCallBack = NULL, void * Context = NULL);  //连接IVS设备
    AIIVS_API int __stdcall AIIVS_OpenStream(LONG nID , int nCh,fRealDataCallBack pRealDataCallBack = NULL,void *RealDataCallBackContext = NULL);//开启视频流,返回通道流IDAIIVS_API int __stdcall AIIVS_GetHeadStream(LONG nID , int nCh,VIDEO_INFO *pVideoInfo);//获取视频流头部
    IVSPLAY_API BOOL _stdcall IVS_PLAY_Init();//初始化
    IVSPLAY_API LONG _stdcall IVS_PLAY_OpenStream(HWND hWnd,VIDEO_INFO *pVideo_info,bool bRealdecode = true);//打开流播放
    /*********************************C#*******************************************/ public const string aiIvs = "AIIVS.dll";
            public delegate void MSGCallBack(long lCommand,long nID,int nCh, ref MSG_INFO pAlarmInfo,uint dwBufLen,ref int Context);
            public delegate void fRealDataCallBack(long nStreamID, long nID, int nCh, byte[] pBuffer, uint dwBufSize, timeval presentationTime,ref int RealDataCallBackContext);
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct VIDEO_INFO
        {
     public int nVideoWidth;//视频像素宽度
     public int nVideoHeight;//视频像素高度
     public int nVideoFPS;//视频每秒播放帧数
     public byte[] data;//解码头
     public int dataSize;//解码头长度
     public timeval presentationTime;//解码头时间戳
        }
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct MSG_INFO
        {
            public string ip;/**报警设备IP */
            public long object_id;/**对象ID */
            public long rule_name;/**参考枚举 Rule_name */
            public long rule_id;/**规则ID */
            public double rel_center_x;
            public double rel_center_y;
            public double rel_dimension_x;
            public double rel_dimension_y;
            public double rel_velocity_x;
            public double rel_velocity_y;
            public long preset_id;
            public double direction;
            public double time_in_rule;
            public double range;
        }
        public struct timeval
        {
           public long tv_sec;
           public long tv_usec;
        }
            [DllImport(aiIvs]
            public static extern void AIIVS_Init();        [DllImport(aiIvs]
            public static extern long AIIVS_Connect(string sIp, int nPort , string sName , string sPwd ,MSGCallBack pMsgCallBack, ref int Context);
            [DllImport(aiIvs, EntryPoint = "_AIIVS_OpenStream@16")]
            public static extern int AIIVS_OpenStream(ref long nID ,ref int nCh,ref fRealDataCallBack pRealDataCallBack, ref int RealDataCallBackContext);//开启视频流,返回通道流ID
            public const string ivsPlay = "IVSPlay.dll";
            [DllImport(ivsPlay]
            public static extern bool IVS_PLAY_Init();
            [DllImport(ivsPlay]
            public static extern long IVS_PLAY_OpenStream(IntPtr hWnd,ref VIDEO_INFO pVideo_info, bool bRealdecode);    public partial class frmVido : Form
        {
            public frmVido()
            {
                InitializeComponent();
            }
            public int n_lUserID = -1;
            public int RealDataCallBackContext = -1;
            public IvsAPI.MSGCallBack MsgBack;
            public IvsAPI.fRealDataCallBack FrdcBack;
            private void frmVido_Load(object sender, EventArgs e)
            {
                IvsAPI.AIIVS_Init();
                VIDEO_INFO video = new VIDEO_INFO();
                MsgBack = new IvsAPI.MSGCallBack(msgCallBack);
                FrdcBack = new IvsAPI.fRealDataCallBack(frcBack);
                int ibi = 0;            long ll = IvsAPI.AIIVS_Connect("192.168.1.15", 80, "admin", "admin",MsgBack, ref n_lUserID);
                int ii = IvsAPI.AIIVS_OpenStream(ref ll, ref ibi,ref FrdcBack, ref RealDataCallBackContext);
                int it = IvsAPI.AIIVS_GetHeadStream(ll, 1, ref video);
                bool bolt = PlayAPI.IVS_PLAY_Init();
                long lon = PlayAPI.IVS_PLAY_OpenStream(pictureBox1.Handle, ref video, true);
            }
            private void ListenAlarmThreadProc()
            {
            }
            private void msgCallBack(long lCommand, long nID, int nCh, ref MSG_INFO pAlarmInfo, uint dwBufLen, ref int Context)
            {
                MessageBox.Show("成功");
            }
            private void frcBack(long nStreamID, long nID, int nCh, byte[] pBuffer, uint dwBufSize, timeval presentationTime,ref int RealDataCallBackContext)
            {
                bool bol1 = PlayAPI.IVS_PLAY_InputData(nStreamID, pBuffer, dwBufSize);
            }
        }