很简单,不能用指针。但VB支持回调。具体方法:建立一个模块(module),然后声明一个类似
Public Sub MyProc(a as long,b as long,c as long...) as long (具体情况具体分析)
....
myproc=result
end sub
然后在需要函数地址的时候用AddressOf myproc
Public Sub MyProc(a as long,b as long,c as long...) as long (具体情况具体分析)
....
myproc=result
end sub
然后在需要函数地址的时候用AddressOf myproc
然后在这个函数中调用对应的函数吧.
不过这个不行,因为VB中没有像VC++中那们声明一个函数结构,然后把地址传给它再调用.
所以我现在用VB不能实现,也需有高手能实现.
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
要更多的信息请查相应帮助
做一个函数:
Function GetProc(proc As Long) As Long
GetProc = procEnd Function
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)
嘿嘿!等着死机吧!
汇编程序?!有没有其它方法?
to all:
有谁看过《Advanced Visual Basic》的,帮帮忙。
函数是:valstr setstr??
既不清楚了看看开发文档,有人贴了的
VarPtr等取得的是VB的类的地址,再想找真正数据(如字符串)很困难。
我用TRW调了一个小时也没找到。不如用VB自身支持的功能:
在调用API的时候,VB会单独开辟一片内存,把数据全保存进去(比如字符串之类,都按API通用的格式保存),这样我们就容易利用了。
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