Dll erstellen und mit AutoIt nutzen – FreeBasic Tutorial
Ich hab hier mal ein rudimentäres Tutorial zusammengeklopft, welches zeigen soll, wie man in FreeBasic eine Dll für AutoIt erstellt.
Dieses Tutorial richtet sich in erster Linie an all diejenigen, die mit AutoIt begonnen haben zu programmieren und nun so langsam an die Geschwindigkeitsgrenze von AutoIt stoßen.
Ich habe mich für FreeBasic entschieden, weil es Free ist, eine ähnliche Syntax wie AutoIt hat, sehr klein und ohne unnötige Extras daherkommt und bei zahlreichen Tests kleinere und schnellere Dll´s gezaubert hat als andere Compiler.
Wer AutoIt beherscht sollte damit relativ leicht zurechtkommen!
Einrichten von FreeBasic:
Zunächst benötigen wir den Compiler, welcher u.a. hier zu finden ist: http://www.freebasic-portal.de/downloads…indows-199.html
Als Editor verwende ich FBEdit: http://www.freebasic-portal.de/downloads…dit-ide-30.html
EDIT: Dank BugFix kann man nun auch SciTE als Editor verwenden: FreeBasic läßt sich auch rudimentär in SciTE einbinden
1) FreeBasic installieren:
Einfach FreeBASIC-0.23.0-win32.exe ausführen und den Anweisungen folgen
2) FBEdit.zip in den FreeBasic-Ordner enpacken (z.B.: C:\Programme\FreeBASIC\FbEdit)
3) FBEdit starten:
Beim ersten Start muss man die Pfade eingeben:
Compiler Path: C:\Programme\FreeBASIC
Help Path: C:\Programme\FreeBASIC\FbEdit\Help
Activate FbEdit Lite for beginners mit "Nein" beantworten.
4) Hilfe einrichten:
Um die Hilfe in FbEdit benutzen zu können, muss noch das hier geladen werden: http://www.freebasic-portal.de/downloads…0-23-0-198.html
Nach dem Entpacken in FB.chm umbenennen und in den Hilfe-Ordner kopieren.
Ich selber habe noch "win32.hlp" im Hilfe-Ordner liegen
Diese 4 Hilfen (FB.chm, FbEdit.chm, Windows_Styles.chm u win32.hlp) sind standartmässig bereits eingetragen und können via Options-Help Menu editiert werden
Erstellen einer DLL:
1) FbEdit starten
2) File – New Project
3) Project Name und Description eingeben
4) "Project Type" = "Windows dll" auswählen und OK klicken
5) Folgenden Code ins Editorfenster eintippen:
|
Quellcode
|
1 2 3 4 5 6 7
|
Extern "Windows-MS"
Function _Add(iX As Integer, iY As Integer)As Integer Export Return iX + iY End Function
End Extern |
6) Make – Compile im Menü aufrufen oder F5 drücken
Fertig ist die erste Dll
Zum testen benötigen wir noch ein AutoIt-Script:
|
AutoIt-Quellcode
|
1 2 3
|
$hDll = DllOpen("Add.dll") $aResult = DllCall($hDll, "int", "_Add", "int", 1234, "int", 1234) ConsoleWrite("Ergebnis = " & $aResult[0] & @CRLF) |
Kurze Beschreibung der DLL:
Funktionen, welche man mit AutoIt aufrufen möchte, sollten zwischen <Extern "Windows-MS"> und <End Extern> stehen
Dadurch kann man die Funktionen dann mit demselben Namen aufrufen, wie er im Editor auch angegeben ist.
Andernfalls müsste man bei DllCall "_ADD@8" schreiben, und sollte man 3 Parameter übergeben dann: "_ADD@12", bei 4 "_ADD@16" usw…
Die Funktion selber sollte eigentlich selbserklärend sein.
Für jeden Parameter und auch den Rückgabewert muss man einen Datentyp angeben (As Integer)
Das "Export" am Ende der Zeile macht die Funktion "nach aussen hin sichtbar" und muss nur für Funktionen angegeben werden, welche man direkt via AutoIt aufrufen möchte.
Parameter können auch ByRef übergeben werden.
Das funktioniert ungefähr so:
|
Quellcode
|
1 2 3 4 5 6 7
|
Extern "Windows-MS"
Sub _ByRef(iX As Integer, iY As Integer, ByRef iZ As Integer) Export iZ = iX + iY End Sub
End Extern |
|
AutoIt-Quellcode
|
1 2 3
|
$hDll = DllOpen("ByRef.dll") $aResult = DllCall($hDll, "none", "_ByRef", "int", 1234, "int", 1234, "int*", 0) ConsoleWrite("+ Ergebnis = " & $aResult[3] & @CRLF) |
Hier noch ein kurzes Beispiel, wie man den Inlineassembler von FreeBasic benutzt:
|
AutoIt-Quellcode
|
1 2 3
|
$hDll = DllOpen("ASM.dll") $aResult = DllCall($hDll, "int", "_ASM_ADD", "int", 1234, "int", 1234) ConsoleWrite("+ Ergebnis = " & $aResult[0] & @CRLF) |
Verwenden von Arrays:
Um eine große Anzahl von Daten an die Dll zu übergeben bzw. zu erhalten, erstellt man in AutoIt zunächst eine DllStruct und deren Pointer wird an die Dll übergeben.
Beispiel:
2 Arrays vom Typ integer und Singlefloat mit jeweils 100 Einträgen werden benötigt:
In AutoIt erstellt man nun eine DllStruct:
In FreeBasic muss man zunächst einen Type definieren, damit der Compiler weiß wie die Daten im Speicher liegen:
|
Quellcode
|
1 2 3 4 5 6
|
Type t_Struct X(1 To 100) As Integer Y(0 To 99) As Single End Type
Sub _Test(pStruct As t_Struct Ptr) |
(Hier kann man je nach belieben 1-100 oder 0-99 verwenden)
Der Parameter heisst hier pStruct und ist ein Pointer zu einem Speicherbereich in welchem die Daten lt. t_Struct liegen.
Wie man nun damit arbeitet, soll folgendes Beispiel zeigen:
Am Schluss noch ein paar Infos:
Wenn man die Datei mit der Endung .fbp mit einem normalen Text-Editor öffnet, dann kann man die Compileroptionen verändern:
Die Zeile sieht in unseren Beispielen so aus:
1=Windows dll,fbc -s gui -dll -export
Wir fügen nun -R hinzu:
1=Windows dll,fbc -s gui -dll -export -R
Wenn wir die Datei nun mit FbEdit öffnen und neu kompilieren, dann entsteht eine neue Datei mit der Endung .asm
Darin finden wir unsere Funktionen als Assembler Code und das kann manchmal ganz nützlich sein.
Die Parameter -fpmode FAST -fpu SSE legen in bestimmten Fällen noch den Turbo ein.
Wenn die Dll fertig ist, dann am besten 2mal komiplieren, einmal ohne und einmal mit diesen Parametern; und überprüfen welche Version schneller ist
(bei einer meinen Tests konnte ich so eine Funktion von etwa 600ms auf 450ms beschleunigen)
Das wars für´s Erste mal…
Bei Interesse an weiteren, spezielleren Beispielen (z.B.: Bildbearbeitung) einfach melden.
Im Anhang sind noch alle obigen Beispiele als Quallcode und comiliert
EDIT 1
Hier zwei Beispiele für Fortgeschrittene:
Anhand eines einfachen Greyscale-Algorithmuses zeige ich hier, wie man in FreeBasic Multithreading realisiert:
GreyScale.bas:
Und das dazugehörige AutoIt Script zum Testen:
Hier derselbe Algo, allerdings in Assembler: