VB中怎样调用VC中的这个回调函数

likesome 2006-12-25 10:41:16
VC中的原型是这样的


//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)
{
....

NET_DVR_ALARMINFO m_alarminfo;
memcpy(&m_alarminfo, pBuf, sizeof(NET_DVR_ALARMINFO));



BYTE cTemp[CARDNUM_LEN];
memcpy(cTemp, m_sCardNum, CARDNUM_LEN);
....
}



//VC中调用
NET_DVR_SetDVRMessCallBack(MessageCallback);



_______________________________________________________________________________

VB中我是这样写的,请问各位问题主要在哪里
_______________________________________________________________________________


'VB声明我是这样的

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

dim cTemp as String
CopyMemory cTemp, m_sCardNum, ByVal CARDNUM_LEN
'vb中我是这样写的回调的,里面的CopyMemory




Private Function MessageCallback(lCommand As Long, sDVRIP As String, ByRef pBuf As String, dwBufLen As Long) As Integer
....
Dim m_alarminfo As NET_DVR_ALARMINFO
CopyMemory m_alarminfo, pBuf, ByVal Len(m_alarminfo) '这个对不对呀

dim cTemp as string
CopyMemory cTemp, m_sCardNum, ByVal CARDNUM_LEN ' '这个对不对呀特别是cTemp

....
End Function


'调用我是这样的,关于回调我有不明白了,为何MessageCallback是有参数的,为何不管VC和VB,VC调用是没有参数的,VC的也没有吗,参数是怎样传递的

NET_DVR_SetDVRMessCallBack AddressOf MessageCallback
...全文
328 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmlxk0 2007-01-19
  • 打赏
  • 举报
回复
代码貌似没问题了

回调函数不能设置断点的
likesome 2007-01-19
  • 打赏
  • 举报
回复
顶一下,还是没解决呀,提示如上的出错
likesome 2007-01-18
  • 打赏
  • 举报
回复
顶一下
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


benyfeifei 2006-12-27
  • 打赏
  • 举报
回复
NET_DVR_ALARMINFO m_alarminfo;
--------------------
Dim m_alarmInfo As NET_DVR_ALARMINFO 'NET_DVR_ALARMINFO '应该是个结构,具体定义自己写

memcpy(&m_alarminfo, pBuf, sizeof(NET_DVR_ALARMINFO));
--------------------------------------
copymemory Byval VarPtr(m_alarmInfo ), Byval pBuf, Len(m_alarmInfo )
'注意“这里pBuf应该声明成Long型

BYTE cTemp[CARDNUM_LEN];
----------------------------
Dim cTemp(0 to CARDNUM_LEN-1) 'CARDNUM_LEN应该是个常量吧

memcpy(cTemp, m_sCardNum, CARDNUM_LEN);
-------------------------------------
copymemory byval VarPtr(cTemp(0)), Byval m_sCardNum, CARDNUM_LEN
'注意:这个m_sCardNum不知道是怎么定义的,如果m_sCardNum是一个指针,那么可以使用上面的语句,如果不是,则使用下面的语句.

copymemory byval VarPtr(cTemp(0)), Byval VarPtr(m_sCardNum), CARDNUM_LEN
likesome 2006-12-27
  • 打赏
  • 举报
回复
谢谢

NET_DVR_ALARMINFO m_alarminfo;
memcpy(&m_alarminfo, pBuf, sizeof(NET_DVR_ALARMINFO));



BYTE cTemp[CARDNUM_LEN];
memcpy(cTemp, m_sCardNum, CARDNUM_LEN);




把这两句翻译成VB应怎样写呢,谁能帮我看一下,完成后结贴
benyfeifei 2006-12-26
  • 打赏
  • 举报
回复
你的API函数声明和使用都有问题。

API函数的声明如下:
Declare Function NET_DVR_SetDVRMessCallBack Lib "HCNetSDK.dll" (ByVal fMessCallBack As Long) As Boolean
注意:参数不能使用ByRef进行修饰,因为要传递的是一个函数指针,而不是函数指针的指针。至于返回值是否声明成Long,我认为这到无所谓。

回调函数的声明如下:
Private Function MessageCallback(ByVal lCommand As Long, ByVal sDVRIP As Long, ByVal pBuf As Long, Byval dwBufLen As Long) As Long

注意:pBuf最好声明成Long,因为pBuf应该不是指向一个字符串,而是指向段内存。还有sDVRIP这个参数好像有点问题,原型定义是一个char*,而具体函数模块却是一个long,LZ仔细查查吧。

在VB中使用addressof来获取函数指针。
VirtualDesktop 2006-12-25
  • 打赏
  • 举报
回复
关于如何正确copymemory
请看
http://dev.csdn.net/article/13/13066.shtm
VirtualDesktop 2006-12-25
  • 打赏
  • 举报
回复
写错了一点东西
vb里面获取函数参数不用copymemory,只需要这样即可,多写一个函数来获取目标函数的地址


应该是
vb里面获取函数地址不用copymemory,只需要这样即可,多写一个函数来获取目标函数的地址
VirtualDesktop 2006-12-25
  • 打赏
  • 举报
回复
第一
BOOL要翻译成Long

C++里面的回调参数其实就是调用函数的指针,所以后面没有参数
函数和变量一样,也是有自己地址的,可以用这个地址来调用函数,具体lz应该补补C++了~

vb里面获取函数参数不用copymemory,只需要这样即可,多写一个函数来获取目标函数的地址

public function GetFunAddress(func as long) as long
GetFunAddress=func
end function

调用:
dim funcadd as long
funcadd=GetFunAddress(addressof MessageCallback)

funcadd就是你要的那个long类型的参数了

1,486

社区成员

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

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