Einleitung

Bearbeiten

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?

DLL erstellen

Bearbeiten

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.

einbinden

Bearbeiten

Deklaration

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

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.

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!!!

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

Bearbeiten

ZStrings 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\