最近在用vb结合海康的dvr做视频监控的项目,预览、控制球机都可以了,但是想捕获摄像头的报警信息时用到回调函数,在vb中不知如何转换了。
vc的实现方法是:
typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser);
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser);
我在vb中这样写了:Public Declare Function NET_DVR_SetDVRMessageCallBack_V30 Lib "HCNETSDK.dll" ( _
ByVal fMessageCallBack As MSGCallBack, _
ByVal pUser As Long _
) As Boolean
Public Sub MSGCallBack( _
ByVal lCommand As Long, _
ByVal dwDataType As Long, _
ByVal dwBufSize As Long, _
ByVal pUser As Long)
End Sub
但是, ByVal fMessageCallBack As MSGCallBack, _报错,请问哪位能指教一下,谢谢。
vc的实现方法是:
typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser);
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser);
我在vb中这样写了:Public Declare Function NET_DVR_SetDVRMessageCallBack_V30 Lib "HCNETSDK.dll" ( _
ByVal fMessageCallBack As MSGCallBack, _
ByVal pUser As Long _
) As Boolean
Public Sub MSGCallBack( _
ByVal lCommand As Long, _
ByVal dwDataType As Long, _
ByVal dwBufSize As Long, _
ByVal pUser As Long)
End Sub
但是, ByVal fMessageCallBack As MSGCallBack, _报错,请问哪位能指教一下,谢谢。
解决方案 »
- 求一提示窗源码,要求在允许的范围内,Tooltip会跟随鼠标移动
- 关于richtextbox的一个问题,请高手帮帮忙,谢谢
- 弱智问题.如何设置一个窗体为首先启动的窗体?
- [求救]未找到方法或数据源.怎么回事啊这段代码?
- 如何判断使用了checkbox的listview控件中是否有listitems被checked以及......
- 问题又来了!!!!
- 向大家请教一个简单的问题
- 请问,在VB中怎样播放GIF格式的动画? Help?
- 请问谁有五笔字根字库,且如何用VB编程安装该字库?
- vb问题,谢谢帮忙
- 用电脑Ip地址加密软件
- Win7/8中,如何在程序中用设置另一个exe文件始终以管理员身份运行?
' 标准模块中的代码:
Public Declare Function NET_DVR_SetDVRMessageCallBack_V30 Lib "HCNETSDK.dll" ( _
ByVal fMessageCallBack As Long, ByVal pUser As Long) As Boolean
Public Sub MSGCallBack( _
ByVal lCommand As Long, _
ByVal dwDataType As Long, _
ByVal dwBufSize As Long, _
ByVal pUser As Long)
' 这个函数的具体实现…………
' .......
' .......
' .......
' .......
End Sub' 示例:
Private Sub Command1_Click()
Dim retVal As Boolean
' NET_DVR_SetDVRMessageCallBack_V30( ) 调用示例, xxxxx按你的实际情况写
retVal = NET_DVR_SetDVRMessageCallBack_V30(AddressOf MSGCallBack, xxxxx)
End Sub
' {
Debug.Print "NET_DVR_SetDVRMessageCallBack_V30 Succ"
' }c#有个例子是这样实现的:
m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback);
if (CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(m_falarmData, IntPtr.Zero))
{
DebugInfo("NET_DVR_SetDVRMessageCallBack_V30 Succ");
}
else
{
uint i = CHCNetSDK.NET_DVR_GetLastError();
DebugInfo("NET_DVR_SetDVRMessageCallBack_V30 Fail");
} /*********************************************************
Function: MSGCallBack
Desc: (回调函数)
Input:
Output:
Return:
**********************************************************/
public delegate void MSGCallBack(int lCommand, ref NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser); [DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, IntPtr pUser);
public void MsgCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
MyDebugInfo AlarmInfo = new MyDebugInfo(DebugInfo);
switch (lCommand)
{
case CHCNetSDK.COMM_ALARM:
ProcessCommAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
case CHCNetSDK.COMM_ALARM_V30:
ProcessCommAlarm_V30(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
case CHCNetSDK.COMM_ALARM_RULE:
this.BeginInvoke(AlarmInfo, "COMM_ALARM_RULE");
break;
case CHCNetSDK.COMM_TRADEINFO:
this.BeginInvoke(AlarmInfo, "COMM_TRADEINFO");
break;
case CHCNetSDK.COMM_IPCCFG:
this.BeginInvoke(AlarmInfo, "COMM_IPCCFG");
break;
case CHCNetSDK.COMM_IPCCFG_V31:
this.BeginInvoke(AlarmInfo, "COMM_IPCCFG_V31");
break;
default:
break;
}
}
你那个 IntPtr.Zero 是什么东东???
按函数原型的“参数”来看,应该是一个“用户名字符串”的指针啊……
你可以先试下,把它内部的代码全部注释掉。
然后,写一、两句普通代码,比如 定义一个局部Long变量,然后就写一句随便赋个值的。
如果可以在IDE下运行,可以写一句: debug.print lCommand, dwDataType ,dwBufSize ,pUser
或者写句 msgbox 语句,看能不能被执行到、会不会再造成错误。从你提供的信息来看,NET_DVR_SetDVRMessageCallBack_V30( )就是应该象我在 1F 说的那样声明和使用。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。