还是关于调用回调函数的有关问题是不是小弟我的思路有有关问题

还是关于调用回调函数的问题是不是我的思路有问题

//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
辅助调试,查看参数