转自MSDN。
在 Visual Basic 6.0 中,AddressOf 运算符用于将函数在内存中的地址传递给将函数指针用作参数的 API 过程。
在 Visual Basic .NET 中,AddressOf 运算符必须与 Delegate 类型一起使用。委托允许 Visual Basic .NET 保持一个指向函数的指针(即使已对该函数本身进行了垃圾回收)。
下面的示例阐释如何升级使用 AddressOf 的回调函数:
' Visual Basic 6.0
Declare Function SetWindowLong Lib "USER32.DLL" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal attr As Long, ByVal lVal As Long) As Long
Sub SubClassWindow(ByVal hwnd As Long)
If PrevProcPtr = 0 Then
PrevProcPtr = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubClassProc)
End If
End Sub
' After upgrade to Visual Basic .NET
Declare Function SetWindowLong Lib "USER32.DLL" Alias "SetWindowLongA"(ByVal hwnd As Integer, ByVal attr As Integer, ByVal lVal As Integer) As Integer
Sub SubClassWindow(ByVal hwnd As Integer)
If PrevProcPtr = 0 Then
' UPGRADE_WARNING: Add a delegate for AddressOf SubClassProc.
PrevProcPtr = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubClassProc)
End If
End Sub
下一步做什么
为 AddressOf 运算符添加一个委托,将函数声明的参数更改为 Delegate 类型:
Delegate Function SubClassProcDelegate(ByVal hwnd As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Declare Function SetWindowLong Lib "USER32.DLL" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal attr As Integer, ByVal lVal As SubClassProcDelegate) As Integer
Sub SubClassWindow(ByVal hwnd As Integer)
If PrevProcPtr = 0 Then
PrevProcPtr = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubClassProc)
End If
End Sub