CallBACK


Omschrijving:

Callback is het adres van een programma functie die als parameter in een API call 
wordt gebruikt.  De syntaxis is:

callback addressPTR, functionName(type1, type2...), returnValue

(Noteer: Een CALLBACK is een zeer moderne programmering techniek. Zij moeten alleen  
door programmeurs met een goede werkingskennis gebruikt worden bij het aanroepen 
van API functies met CALLDLL.)

Een CALLBACK commando zet een geheugenadres op voor de functie op die in het bevel 
wordt gespecificeerd. Een API functie kan dit adres dan gebruiken om de 
gespecificeerde functie te roepen vaak, vandaar de term CALLBACK.  
De meeste API functies worden eenmalig geroepen, en terugkeren met één enkele waarde terug. 
Een CALLBACK functie staat vaak met het programma in wisselwerking. 
De parameters worden meer in detail hieronder verklaard.

Gebruik:

addressPTR
Deze parameter wijst een naam aan het geheugenadres toe van de functie. 
Deze naam wordt gebruikt in de API call die het geheugenadres vereist.

functionName
Deze parameter is de naam van de functie in het Liberty BASIC programma dat 
door de API functie werd aangeroepen.

(type1, type2...) 
Het CALLBACK statement vereist een door komma's gescheiden lijst van parameters 
die  specifiek is voor de gebruikte functie.  De meeste Windows API referenties 
bevatten documentatie over de bijzondere beschikbare functies.  
De parameters moeten geldige gegevens TYPES zoals "ulong" en "long" zijn.

returnValue 
Het TYPE van de terugkeerwaarde is vermeld na het sluitende haakje.  
De functie van de Liberty BASIC kan een waarde naar de roepende functie terugsturen.

In de volgende demo, houdt de functie van de Liberty BASIC een interne telling bij, 
en keert met 1 terug als het informatie blijft verwerken en 0 wanneer het controle 
aan de roepende functie overdraagt. Het print de namen van de eerste 5 vensters 
die worden verzonden door  de EnumWindows API, dan geeft het de controle terug 
aan de roepende functie.

texteditor #win.te, 10, 10, 250, 250
open "Enum Windows Example" for window as #win
print #win, "trapclose [quit]"

'set the variable named address to be the memory address for
'enumWndProc() using TYPES handle and ulong, and set
'the return TYPE of enumWndProc() to be a boolean

callback address, enumWndProc(handle, ulong), boolean

'call EnumWindows, which in turn calls back into the
'BASIC function at address.

calldll #user32, "EnumWindows", _
    address as ulong, _
    0 as long, _
    result as boolean

wait

[quit]
close #win
end

function enumWndProc(hwnd, lparam)
    labelBuffer$ = space$(71)
    calldll #user32, "GetWindowTextA", _

        hwnd as ulong, _
        labelBuffer$ as ptr, _
        70 as long, _
        result as long

    if left$(labelBuffer$, 1) <> chr$(0) then
        print #win.te, labelBuffer$
        call setCount getCount()+1
    end if
    if getCount() = 5 then
        enumWndProc = 0   'returning 0 causes EnumWindows to return
      else
        enumWndProc = 1
    end if

end function

sub setCount value
    count(0) = value
end sub

function getCount()
    getCount = count(0)
end function