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

Reference

AddressOf Operator

Delegate Statement