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

likesome 2007-01-08 04:17:12

//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程序我运行了一下,没有错误,但是接收不到任何报警信号呀



...全文
336 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmlxk0 2007-01-19
  • 打赏
  • 举报
回复
不要设置断点,然后使用
debug.print lCommand
辅助调试,查看参数
likesome 2007-01-19
  • 打赏
  • 举报
回复
顶一下,还是没解决呀,提示如上的出错
likesome 2007-01-11
  • 打赏
  • 举报
回复
我已经这样声时了

Declare Function NET_DVR_SetDVRMessCallBack Lib "HCNetSDK.dll" (ByVal fMessCallBack As Long) As Long


Public Function MessageCallback(ByVal lCommand As Long, ByVal sDVRIP As Long, ByVal pBuf As Long, ByVal dwBufLen As Long) As Long
Select Case lCommand
Case 4352

Case Else
Exit Function
End Select
End Function


''调用

NET_DVR_SetDVRMessCallBack AddressOf MessageCallback


可以我在回调这设置断点,一执行到回调这,就vb出错退出,出退提示

出错提示如下

dde server windows

0x016bf406 指令引用的 0x000000c1内存,房内存不能为 read

jadeluo 2007-01-09
  • 打赏
  • 举报
回复
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
Tiger_Zhao 2007-01-09
  • 打赏
  • 举报
回复
字符串参数问题,见前面的贴
http://community.csdn.net/Expert/topic/5281/5281886.xml?temp=.2766992
likesome 2007-01-08
  • 打赏
  • 举报
回复
自己顶

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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