关于回调函数怎样改写成c#

ab_study_c 2010-07-05 01:34:01
关于回调函数怎样改写成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
);
...全文
554 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangbudao 2011-10-17
  • 打赏
  • 举报
回复
请高手帮忙看看这段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();//初始化SDK

AIIVS_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);//开启视频流,返回通道流ID

AIIVS_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);
}
}
zhenlisuozai 2010-10-11
  • 打赏
  • 举报
回复
同理,请问转成vb.net怎么转,谢谢!
ab_study_c 2010-07-13
  • 打赏
  • 举报
回复
好的,谢谢了,先试试
Baesky 2010-07-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
);

兔子-顾问 2010-07-13
  • 打赏
  • 举报
回复
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
I520WUCHAN 2010-07-13
  • 打赏
  • 举报
回复
学习了.
兔子-顾问 2010-07-13
  • 打赏
  • 举报
回复
很简单的一个结构

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*这个要看看实际对应是什么。
ab_study_c 2010-07-13
  • 打赏
  • 举报
回复
还是没搞懂........
qqiuzaihui 2010-07-09
  • 打赏
  • 举报
回复
ab_study_c 2010-07-09
  • 打赏
  • 举报
回复
请哪位帮帮忙改一下.
微醺_zZ 2010-07-09
  • 打赏
  • 举报
回复
用AJAX去调写在C#中的函数就可以了吧?
yuanhuiqiao 2010-07-06
  • 打赏
  • 举报
回复
Unsafe编程
ab_study_c 2010-07-06
  • 打赏
  • 举报
回复
谢谢各位.

是这样的:此函数是海康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_GetLastError

Remarks
该接口中回调函数的第一个参数(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#
swimmingfish2004 2010-07-06
  • 打赏
  • 举报
回复
C#中的委托。
楼主要把问题描述清楚,如wuyazhe所说的。这样才好解答。
ab_study_c 2010-07-06
  • 打赏
  • 举报
回复
void *pUser 在C#该怎样定义?
烈火蜓蜻 2010-07-06
  • 打赏
  • 举报
回复
void *pUser
无类型的指针
xiaowang1026 2010-07-06
  • 打赏
  • 举报
回复
void *pUser
这个参数怎么解释呀?那个帮忙回答一下

兔子-顾问 2010-07-06
  • 打赏
  • 举报
回复
有点乱。整理一下格式:
VC的函数声明:
....
C#下的声明:
....
c#下的调用:
.....

并且代码用
标注起来。
ab_study_c 2010-07-06
  • 打赏
  • 举报
回复
顶一下,看哪位高手能改一下
ab_study_c 2010-07-05
  • 打赏
  • 举报
回复
改为:public delegate bool MessCallBack(int lCommand,NET_DVR_ALARMER pAlarmer,string pAlarmInfo,uint dwBuflen,int pUser)

依然有问题
加载更多回复(5)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧