关于回调函数怎样改写成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
);
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
);
解决方案 »
- 问一个关于BMP文件大小的问题。。。。!!!谢谢!!!
- C# Winform 权限设置思路(已有),请指教是否OK
- SOCKET 与程序 结合 问题
- 在C#的MDI应用程序中,如何判断某个子窗口是否被激活
- 还是关于串口~
- dataset与datatable的问题
- 关于UDP的一个问题
- 谁知道BeginBatch是实现什么功能的?msn的解释语焉不详,看不明白
- DataGridView 绑定了DataTable 数据 我加了一列DataGridViewCheckBoxColumn 如何根据选中的生成新的DT
- C#里如何实现一个程序运行以后只显示一个系统托盘图标,右击它时会有菜单显示.
- 客户端如何能访问到服务器端的图像文件?
- 初学,常量 byte[] 不能初始化时赋值吗?
VC的函数声明:
....
C#下的声明:
....
c#下的调用:
.....并且代码用标注起来。
这个参数怎么解释呀?那个帮忙回答一下
无类型的指针
楼主要把问题描述清楚,如wuyazhe所说的。这样才好解答。
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#
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*这个要看看实际对应是什么。
{
....你定义
}
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
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
);
/**********************************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);
}
}