直接callwindowproc就行了......dim i as longi=callwindowproc(addressof kk,0,0,0,0)'i是返回值. 模块内是KK:public function kk() as long msgbox ".........." kk=999 end function
要正确调用函数,必须要有约定的或可查询的函数定义。 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
参数从右住左压栈
Push 参数n
Push 参数n-1
....
....
push 最左边参数'CALL 目标地址
call 你的sub指针
'如果要参数就从EAX取popad写好上面这代码后,去手工计算成BYTE数组,然后想办法的执行它,比如CallWindowProc()
如果用这个API,那你还得在上面这段代码加个假的涵数壳
模块内是KK:public function kk() as long
msgbox ".........."
kk=999
end function
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
另外,既然“因为这个Sub地标识符不确定”,那么又何如使用AddressOf得到Sub的地址?