Add a delegate for AddressOf operator
In Visual Basic 6.0, the AddressOf operator was used to pass the address in memory of a function to an API procedure that takes a function pointer as an argument.
In Visual Basic 2008, the AddressOf operator must be used with a Delegate type. Delegates allow Visual Basic 2008 to maintain a pointer to a function even if the function itself has already been garbage-collected.
The following example illustrates how a callback function that uses AddressOf is upgraded:
' 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 2005
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
What to do next
Add a delegate for the AddressOf operator, and change the parameter of the function declaration to the Delegate type:
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
See Also
Concepts
Delegates and the AddressOf Operator