FreeBasic: DLL
Aus Wikibooks
Inhaltsverzeichnis |
[Bearbeiten] Einleitung
In 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?
[Bearbeiten] DLL erstellen
Nehmen 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.
[Bearbeiten] einbinden
[Bearbeiten] Deklaration
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
[Bearbeiten] .bi
Nun 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.
[Bearbeiten] .bas
Nun 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!!!
[Bearbeiten] dynamisch
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
[Bearbeiten] Tipps und Tricks
ZStrings am besten als Pointer übergeben wenn man die DLL auch mit anderen Sprachen benutzen will.
Overload (also überladen)
[Bearbeiten] Quellen und weiterführende Infos
- FreeBASIC\examples\dll\