很简单,不能用指针。但VB支持回调。具体方法:建立一个模块(module),然后声明一个类似
Public Sub MyProc(a as long,b as long,c as long...) as long (具体情况具体分析)
  ....
  myproc=result
end sub
然后在需要函数地址的时候用AddressOf myproc

解决方案 »

  1.   

    我想你的意思是在DLL中写一个函数,可以接收一个函数地址参数,
    然后在这个函数中调用对应的函数吧.
    不过这个不行,因为VB中没有像VC++中那们声明一个函数结构,然后把地址传给它再调用.
    所以我现在用VB不能实现,也需有高手能实现.
      

  2.   

    得到函数指针
    addressof functionsample:Declare Function CallWindowProc Lib "user32" Alias _
    "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
       ByVal hwnd As Long, ByVal Msg As Long, _
       ByVal wParam As Long, ByVal lParam As Long) As LongDeclare Function SetWindowLong Lib "user32" Alias _
    "SetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = -4
    Global lpPrevWndProc As Long
    Global gHW As LongPublic Sub Hook()
       lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
       AddressOf WindowProc)
    End SubPublic Sub Unhook()
       Dim temp As Long
       temp = SetWindowLong(gHW, GWL_WNDPROC, _
       lpPrevWndProc)
    End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As _
    Long, ByVal wParam As Long, ByVal lParam As Long) As _
    Long
       Debug.Print "Message: "; hw, uMsg, wParam, lParam
       WindowProc = CallWindowProc(lpPrevWndProc, hw, _
       uMsg, wParam, lParam)
    End FunctionPrivate Sub Form_Load()
       gHW = Me.hwnd
    End SubPrivate Sub Command1_Click()
       Hook
    End SubPrivate Sub Command2_Click()
       Unhook
    End Sub
    要更多的信息请查相应帮助
      

  3.   

    AddressOf 实际上就是函数指针,不过在VB的具体使用中要把它直接赋给变量需要如下的Trick:
      做一个函数:
    Function GetProc(proc As Long) As Long    
    GetProc = procEnd Function
      

  4.   

    对不起,再来,应该是:
    Function GetProc(proc As Long) As Long    
         GetProc = proc
    End Function
    赋值时这样:
      Dim msgpars As MSGBOXPARAMS
      msgpars.lpfnMsgBoxCallback = GetProc(AddressOf MyMsgBoxProc)当然,在VB里玩函数指针非常危险,比如EnumWindows回调函数需要两个参数,但你这样做:
         Function CrashMe() As Long    
             CrashMe = 1
         End Functionf = EnumWindows(AddressOf CrashMe, c)
    嘿嘿!等着死机吧!
      

  5.   

    有人做个类似的工作,但没能实现。建议 看看 那本 <<Advanced Visual Basic>>
      

  6.   

    这个问题我曾经问过的.你去翻翻MSDN,上面有个汇编例子能满足你的需要.
      

  7.   

    Amoon(阿木),你看<<Advanced Visual Basic>>了吗? 第11 章 有这方面的 内容。但我还没看到 那儿。 不晓得 对你是否有用。
      

  8.   

    to Amoon(阿木):
    汇编程序?!有没有其它方法?
    to all:
    有谁看过《Advanced Visual Basic》的,帮帮忙。
      

  9.   

    http://www.csdn.net/expert/topic/275/275790.xml看这篇!能满足你的要求。
      

  10.   

    虽然vb不能使用指针,但是可以得到变量内存地址
    函数是:valstr  setstr??
    既不清楚了看看开发文档,有人贴了的
      

  11.   

    TO  shawls(小山(坚持VB,学Delphi和C#)) 
    VarPtr等取得的是VB的类的地址,再想找真正数据(如字符串)很困难。
    我用TRW调了一个小时也没找到。不如用VB自身支持的功能:
    在调用API的时候,VB会单独开辟一片内存,把数据全保存进去(比如字符串之类,都按API通用的格式保存),这样我们就容易利用了。
      

  12.   

    AddressOf可以得到本地函数的指针(或函数委派),但是不能用VB调用函数指针所指的函数。所以当你想实现自己的函数回调,用接口实现
      

  13.   

    除了用VC和汇编之外,有没有能用VB实现的方法?
      

  14.   

    我在DLL的类模块中设置了一个ErrorOccur事件,发生错误时调用RaiseEvent ErrorOccur,然后在外部程序中使用withevents声明类模块实例,这样可以实现类似回调函数的功能。但问题是我必须在标准模块而不是类模块中使用回调函数,不知有没有类似的方法可以实现?
      

  15.   

    说难也不难,用VC写一个用于调用回调函数的函数,如:
    void CallProc((Proc *)TheProc())
    {
      TheProc();
    }
    然后编译成DLL,并在VB中声明外部函数CallProc, 当VB需要回调时,比如:
    Decalare Public Sub CallProc Lib "CallProc.Dll" (byref ProcAddr)public sub DoIt(Param1 as integer, byref ErrProc as any)
    ......
    if Param1=0 then CallProc(ErrProc)
    ......
    end
      

  16.   

    http://www.csdn.net/expert/topic/495/495942.xml