FreeBasic: DLL
Einleitung
BearbeitenIn einer DLL sind nur Funktionen und Subroutinen erlaubt.
Wieso DLL?
- Viele Programme können sich die Subroutinen teilen und sollte es mit einer Subroutine Probleme geben (andere Windows Version, Sicherheitslücke) so lässt sich dieses Problem durch die Modifikation einer Datei beheben.
Wieso nicht?
- Habt ihr eine DLL bei vielen verschiedenen Projekten im Einsatz, so lassen sich die Schnittstellen kaum mehr ändern.
Alternativen
- #Include ...
Zu beachten bei Linux?
DLL erstellen
BearbeitenNehmen wir an, wir wollen folgende Funktionen in einer DLL:
sub PrintRot(text as string)
color 4
Print text
end sub
function Quadrat(a as double) as double
return a^2
End function
Abgespeichert in einer Datei Namens "Library.bas".
Erst mal ein Export dran und die Funktion definieren. (auf eine etwas Spezielle Art)
declare sub PrintRot lib "Library" alias "PrintRot"(text as string)
declare function Quadrat lib "Library" alias "Quadrat" (a as double) as double
sub PrintRot(text as string) export
color 4
Print text
end sub
function Quadrat(a as double) as double export
return a^2
End function
dann mit -dylib kompilieren.
(Genau so wie man mit -s gui arbeitet einfach statt -s gui mit -dylib)
Jetzt das -dylib wieder raus, sonst gibt es ärger.
einbinden
BearbeitenDeklaration
Bearbeiten declare sub PrintRot lib "Library" alias "PrintRot"(text as string)
declare function quadrat lib "Library" alias "Quadrat" (a as double) as double
PrintRot("Hallo Welt")
PrintRot(str$(Quadrat(5)))
sleep
.bi
BearbeitenNun müssen wir die Datei "Library.bi" erstellen.
declare sub PrintRot lib "Library" alias "PrintRot"(text as string)
declare function quadrat lib "Library" alias "Quadrat" (a as double) as double
Wie ihr sehen könnt, kann man die Datei einfach aus den Deklarationen von "Library.bas" ableiten.
.bas
BearbeitenNun müssen wir die Datei "Testlibrary.bas" erstellen.
#include once "Library.bi"
PrintRot("Hallo Welt")
PrintRot(str$(Quadrat(5)))
sleep
Kompilieren mit fbc -s console Testlibrary.bas
Arbeitet nur in console modus!!!
dynamisch
Bearbeiten dim PrintRot as sub (text as string)
dim Quadrat as function (a as double) as double
library = dylibload( "Library.dll" )
if library = 0 then
cls
?
? " DLL nicht gefunden."
sleep 1000,1
else
PrintRot = dylibsymbol( library, "PrintRot" )
quadrat = dylibsymbol( library, "Quadrat" )
PrintRot("Hallo Welt")
PrintRot(str$(Quadrat(5)))
sleep
End if
Tipps und Tricks
BearbeitenZStrings am besten als Pointer übergeben wenn man die DLL auch mit anderen Sprachen benutzen will.
Overload (also überladen)
Quellen und weiterführende Infos
Bearbeiten- FreeBASIC\examples\dll\