VB6中DLL回调函数使用,无法获取到回调函数中的值?

oxfordxyc 2010-07-18 11:10:09
dll说明:

void __stdcall SetRecDataProc(void ** Proc)

参数入口:
Proc:指向数据接收函数的指针的指针(二级指针),其函数据参数列表如下所示:
void __stdcall (*RecItemProc)(double Force,double Displacement,double Extend);
返回值:无返回值。
函数功能:设置一个回调函数,当接收到试验机的数据时,调用此函数,传送力值、位移与变形给客户程序。


在VB模块中声明:
Public Declare Sub SetRecDataProc Lib "RFComm32.dll" (ByRef lpProc As Long)
Public fff as Double

Public Sub RecItemProc(ByVal Force As Double, ByVal Displacement As Double, ByVal Extend As Double)
fff = Force
End Sub

在窗体代码中调用:

Function GetFuncPtr(ByVal Ptr As Long) As Long
GetFuncPtr = Ptr
End Function

Private Sub Command1_Click()
SetRecDataProc GetFuncPtr(AddressOf RecItemProc)
Debug.Print fff
End Sub

得到的fff值为0

但是用DELPHI的DEMO是可以取到非0值的。哪位高手有什么好的办法能够取到Force的值?万分感谢!
...全文
280 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldy888 2010-07-19
  • 打赏
  • 举报
回复
两头大牛都在,顺便问一下。


更正标点符号,以示尊敬
ldy888 2010-07-19
  • 打赏
  • 举报
回复
Function GetFuncPtr(ByVal Ptr As Long) As Long
GetFuncPtr = Ptr
End Function

Private Sub Command1_Click()
lpProc = GetFuncPtr(AddressOf RecItemProc)
SetRecDataProc VarPtr(lpProc)
End Sub

两头大牛,都在顺便问一下。


lpProc = Val(AddressOf RecItemProc)
替代
lpProc = GetFuncPtr(AddressOf RecItemProc)

这样少了一个GetFuncPtr函数 是否会快速,简洁一些?


ldy888 2010-07-19
  • 打赏
  • 举报
回复
MARK
..............................
Tiger_Zhao 2010-07-19
  • 打赏
  • 举报
回复
1)除非你保证传过去的函数指针马上被调用,否则不能马上检查 fff 的值。
2)AddressOf 只是一级指针,5楼给出了传二级指针的方法,不过指向临时变量的指针不保险。
'在VB模块中声明:
Public Declare Sub SetRecDataProc Lib "RFComm32.dll" (ByRef lppProc As Long)
Public fff as Double
Public lpProc As Long

Public Sub RecItemProc(ByVal Force As Double, ByVal Displacement As Double, ByVal Extend As Double)
fff = Force
Debug.Print fff
End Sub

'在窗体代码中调用:

Function GetFuncPtr(ByVal Ptr As Long) As Long
GetFuncPtr = Ptr
End Function

Private Sub Command1_Click()
lpProc = GetFuncPtr(AddressOf RecItemProc)
SetRecDataProc VarPtr(lpProc)
End Sub
chenhui530 2010-07-19
  • 打赏
  • 举报
回复
SetRecDataProc byval varptr(GetFuncPtr(AddressOf RecItemProc))
oxfordxyc 2010-07-19
  • 打赏
  • 举报
回复
回3#问题:
你 Command1_Click() 的时候,能满足“接收到试验机的数据”吗?
你的程序运行的时候,是不是能加载 RFComm32.dll ,并在另一个线程中进行数据采样?

可以保证在程序运行的时候,已经加载了 RFComm32.dll ,因为我在调用其他的控制方法的时候都是可以控制试验机的数据变化。

明天到现场用6楼的方式测试一下,谢谢!
舉杯邀明月 2010-07-19
  • 打赏
  • 举报
回复
或者你在 Command1_Click() 中调用SetRecDataProc()时,它就会对“试验机的数据”进行一次采集操作?
舉杯邀明月 2010-07-19
  • 打赏
  • 举报
回复
函数功能:设置一个回调函数,当接收到试验机的数据时,调用此函数,传送力值、位移与变形给客户程序。


你 Command1_Click() 的时候,能满足“接收到试验机的数据”吗?
你的程序运行的时候,是不是能加载 RFComm32.dll ,并在另一个线程中进行数据采样?
oxfordxyc 2010-07-19
  • 打赏
  • 举报
回复
谢谢楼上!
ldy888 2010-07-19
  • 打赏
  • 举报
回复
了解。。
Tiger_Zhao 2010-07-19
  • 打赏
  • 举报
回复
Val() 传入 String 返回 Double,需要两次类型转换,速度更低。
至于简洁性,看个人风格了。

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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