就是用AdressOf获得一个Sub的地址,怎样在其它模块中调用?因为这个Sub地标识符不确定~~~~~~~~~~

解决方案 »

  1.   

    pushad
    参数从右住左压栈
    Push 参数n
    Push 参数n-1
    ....
    ....
    push 最左边参数'CALL 目标地址
    call 你的sub指针
    '如果要参数就从EAX取popad写好上面这代码后,去手工计算成BYTE数组,然后想办法的执行它,比如CallWindowProc()
    如果用这个API,那你还得在上面这段代码加个假的涵数壳
      

  2.   

    VB中用AdressOf获得一个Sub的地址,条件是非常苛刻的,那就是Sub必须在标准模块内。既然在同一工程内,没必要多此一举,直接用Sub名。
      

  3.   

    直接callwindowproc就行了......dim i as longi=callwindowproc(addressof kk,0,0,0,0)'i是返回值.
    模块内是KK:public function kk() as long
         msgbox ".........."
        kk=999
    end function
      

  4.   

    要正确调用函数,必须要有约定的或可查询的函数定义。
    1)比如 CallWindowProc 就是约定了 4个参数+1个返回值 的函数,5楼老马的例子给得不完全正确,函数与约定不一致,会导致堆栈错误。
    2)还有一种做法是通过 tlb 的定义来直接约定函数声明,参考《高级Visual Basic编程》(Advanced Visual Basic)中轻量对象这一章。
    其实在工程内部没必要这么复杂,可以做个代理函数
    '这是多个不确定要调用的函数'
    function f1(byval p as long) as long
    end function
    function f2(byval p as long) as long
    end function
    ...'代理函数,将函数指针换成不同的 ID 而已'
    function f(byval id as long,byval p as long) as long
        select case id
            case 1: f = f1(p)
            case 2: f = f2(p)
            ...
        end select
    end function
      

  5.   

    callwindowproc 的这种用法不会发生栈堆错误
      

  6.   

    在别的进程里,那就直接createremotethread,嘿嘿.
      

  7.   

    远程是不能直接调用的,因为AddressOf获得的是逻辑地址。
      

  8.   

    赞同,既然是同一个工程,何必搞这么麻烦。
    另外,既然“因为这个Sub地标识符不确定”,那么又何如使用AddressOf得到Sub的地址?