还是关于调用回调函数的有关问题是不是小弟我的思路有有关问题
还是关于调用回调函数的问题是不是我的思路有问题
//VC中的API是这样的
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessCallBack(BOOL (CALLBACK *fMessCallBack)(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen));
//VC中的自定义函数
int CALLBACK MessageCallback_EX(LONG lCommand,LONG lUserID,char *pBuf,DWORD dwBufLen)
{
....
....
}
//VC中调用
NET_DVR_SetDVRMessCallBack(MessageCallback);
'vb中我是这样写的
'模块中
Declare Function NET_DVR_SetDVRMessCallBack Lib "HCNetSDK.dll " (ByVal fMessCallBack As Long) As Long
Public Function MessageCallback(lCommand As Long, sDVRIP As String, ByRef pBuf As Long, dwBufLen As Long) As Integer
...
...
end Function
'表单调用
funcadd = GetFunAddress(AddressOf MessageCallback)
NET_DVR_SetDVRMessCallBack funcadd
Public Function GetFunAddress(func As Long) As Long
GetFunAddress = func
End Function
这个函数的功能是接收报警信号,接收到后进行处理,我的理解是调用了一次,是不是程序会自动等待接收,还是要不停的调用呢
这个vb程序我运行了一下,没有错误,但是接收不到任何报警信号呀
------解决方案--------------------
NET_DVR_SetDVRMessCallBack 是用来告诉DLL在有报警信号时该调用你写的哪一个函数。这样的调用称为“回调”,被回调的你写的那个函数称为“回调函数”。
你的NET_DVR_SetDVRMessCallBack的申明没问题:
Declare Function NET_DVR_SetDVRMessCallBack Lib "HCNetSDK.dll " (ByVal fMessCallBack As Long) As Long
但是回调函数的参数申明有问题:
Public Function MessageCallback(lCommand As Long, sDVRIP As String, ByRef pBuf As Long, dwBufLen As Long) As Integer
......
end Function
C中的原型是:
int CALLBACK MessageCallback_EX(LONG lCommand,LONG lUserID,char *pBuf,DWORD dwBufLen)
在VB中应该写成(C中int对应VB中的是Long,而不是Integer):
Public Function MessageCallback(ByVal lCommand As Long, ByVal lUserID As Long, ByVal pBuf As String, ByVal dwBufLen As Long) As Long
......
'pBuf中的字符个数由dwBufLen来指明
......
end Function
以下这个函数有些多余:
Public Function GetFunAddress(func As Long) As Long
GetFunAddress = func
End Function
这样就行了:
NET_DVR_SetDVRMessCallBack AddressOf MessageCallback
------解决方案--------------------
不要设置断点,然后使用
debug.print lCommand
辅助调试,查看参数
//VC中的API是这样的
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessCallBack(BOOL (CALLBACK *fMessCallBack)(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen));
//VC中的自定义函数
int CALLBACK MessageCallback_EX(LONG lCommand,LONG lUserID,char *pBuf,DWORD dwBufLen)
{
....
....
}
//VC中调用
NET_DVR_SetDVRMessCallBack(MessageCallback);
'vb中我是这样写的
'模块中
Declare Function NET_DVR_SetDVRMessCallBack Lib "HCNetSDK.dll " (ByVal fMessCallBack As Long) As Long
Public Function MessageCallback(lCommand As Long, sDVRIP As String, ByRef pBuf As Long, dwBufLen As Long) As Integer
...
...
end Function
'表单调用
funcadd = GetFunAddress(AddressOf MessageCallback)
NET_DVR_SetDVRMessCallBack funcadd
Public Function GetFunAddress(func As Long) As Long
GetFunAddress = func
End Function
这个函数的功能是接收报警信号,接收到后进行处理,我的理解是调用了一次,是不是程序会自动等待接收,还是要不停的调用呢
这个vb程序我运行了一下,没有错误,但是接收不到任何报警信号呀
------解决方案--------------------
NET_DVR_SetDVRMessCallBack 是用来告诉DLL在有报警信号时该调用你写的哪一个函数。这样的调用称为“回调”,被回调的你写的那个函数称为“回调函数”。
你的NET_DVR_SetDVRMessCallBack的申明没问题:
Declare Function NET_DVR_SetDVRMessCallBack Lib "HCNetSDK.dll " (ByVal fMessCallBack As Long) As Long
但是回调函数的参数申明有问题:
Public Function MessageCallback(lCommand As Long, sDVRIP As String, ByRef pBuf As Long, dwBufLen As Long) As Integer
......
end Function
C中的原型是:
int CALLBACK MessageCallback_EX(LONG lCommand,LONG lUserID,char *pBuf,DWORD dwBufLen)
在VB中应该写成(C中int对应VB中的是Long,而不是Integer):
Public Function MessageCallback(ByVal lCommand As Long, ByVal lUserID As Long, ByVal pBuf As String, ByVal dwBufLen As Long) As Long
......
'pBuf中的字符个数由dwBufLen来指明
......
end Function
以下这个函数有些多余:
Public Function GetFunAddress(func As Long) As Long
GetFunAddress = func
End Function
这样就行了:
NET_DVR_SetDVRMessCallBack AddressOf MessageCallback
------解决方案--------------------
不要设置断点,然后使用
debug.print lCommand
辅助调试,查看参数