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 DoublePublic 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 FunctionPrivate Sub Command1_Click()
    SetRecDataProc GetFuncPtr(AddressOf RecItemProc)
    Debug.Print fff
End Sub得到的fff值为0但是用DELPHI的DEMO是可以取到非0值的。哪位高手有什么好的办法能够取到Force的值?万分感谢!

解决方案 »

  1.   

    函数功能:设置一个回调函数,当接收到试验机的数据时,调用此函数,传送力值、位移与变形给客户程序。
    你  Command1_Click() 的时候,能满足“接收到试验机的数据”吗?
    你的程序运行的时候,是不是能加载 RFComm32.dll ,并在另一个线程中进行数据采样?
      

  2.   

    或者你在 Command1_Click() 中调用SetRecDataProc()时,它就会对“试验机的数据”进行一次采集操作?
      

  3.   

    SetRecDataProc byval varptr(GetFuncPtr(AddressOf RecItemProc))
      

  4.   

    1)除非你保证传过去的函数指针马上被调用,否则不能马上检查 fff 的值。
    2)AddressOf 只是一级指针,5楼给出了传二级指针的方法,不过指向临时变量的指针不保险。
    '在VB模块中声明:
    Public Declare Sub SetRecDataProc Lib "RFComm32.dll" (ByRef lppProc As Long)
    Public fff as Double
    Public lpProc As LongPublic 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 FunctionPrivate Sub Command1_Click()
      lpProc = GetFuncPtr(AddressOf RecItemProc)
      SetRecDataProc VarPtr(lpProc)
    End Sub
      

  5.   

    MARK
    ..............................
      

  6.   

    Function GetFuncPtr(ByVal Ptr As Long) As Long
      GetFuncPtr = Ptr
    End FunctionPrivate Sub Command1_Click()
      lpProc = GetFuncPtr(AddressOf RecItemProc)
      SetRecDataProc VarPtr(lpProc)
    End Sub两头大牛,都在顺便问一下。用 
    lpProc = Val(AddressOf RecItemProc)
    替代
    lpProc = GetFuncPtr(AddressOf RecItemProc)这样少了一个GetFuncPtr函数 是否会快速,简洁一些?
      

  7.   

    Val() 传入 String 返回 Double,需要两次类型转换,速度更低。
    至于简洁性,看个人风格了。
      

  8.   

    回3#问题:
    你 Command1_Click() 的时候,能满足“接收到试验机的数据”吗?
    你的程序运行的时候,是不是能加载 RFComm32.dll ,并在另一个线程中进行数据采样?可以保证在程序运行的时候,已经加载了 RFComm32.dll ,因为我在调用其他的控制方法的时候都是可以控制试验机的数据变化。明天到现场用6楼的方式测试一下,谢谢!