Hallo !
Das ist eine "kurze" Anleitung, um C-Dll's zu generieren, welche dann mit AutoIt aufgerufen werden können.
Dies ist vorallem dann wichtig, wenn C -Code-Beispiele vorhanden sind, sich diese aber selbst nicht in AutoIt umsetzen lassen.
Was für Software wird benötigt :
Ich habe für das Beispiel die Programmiersoftware
CODE:BLOX V10.5 heruntergeladen, welche unter
http://www.codeblocks.org/
als openSource geladen werden kann.
--------------------------------------------------------------------------------------------
Erstellen der Ersten Dll:
Offnen Sie Code:Blox.
Klicken Sie "Create a new project"
Im Dialog .. Bereich "Projekts" wählen.
Dort auf "Dynamic Link Library" klicken.
Dann mit "GO" bestätigen.
Es öffnet Sich ein Wissard für Dll's.
Erstes Feld mit "Next" weiter schalten.
Jetzt will der Wissard einen Namen für das Projekt.
Hier nehme ich Test_autoit_Dll.
Den Folder soll er mir auf dem Desktop erstellen.
dann mit "Next" weiterschalten.
Jetzt soll der Compiler ausgewählt werden.
Hier lasse ich die Voreinstellung.
D.h. GNU GCC Compiler
Die Pfade für Debug und Release belasse ich auch gleich.
Der Wissard wird mit "Finish" geschlossen.
--------------------------------------------------------------------------------------------
Nun ist das Projekt erstellt.
Im "Projekts" Reiter im bereich "Management,
lässt sich jetzt im Sourse Ordner dir Datei
"main.h" öffnen.
entfernen Sie komplet jeden Eintrag in der main.h
tragen sie nun die erste Zeile der "main.h"
// ab hier
#include <windows.h>
// bis hier
ein.
--------------------------------------------------------------------------------------------
öffnen Sie nun die "main.cpp"
entfernen Sie das erste Beispiel
// ab hier
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
// bis hier
und tragen Sie folgene Zeilen an dessen Stelle ein :
// ab hier
extern "C" __declspec(dllexport) int dllTest(int a,int b){
int c=0;
c= a+b;
return c;
}
// bis hier
Speichern Sie das Projekt
--------------------------------------------------------------------------------------------
Erklärung der Zeilen :
extern "C" ==> sagt dem Compiler, dass er den Funktionsnamen ( hier dllTest) so beibehalten soll.
__declspec(dllexport) ==> wird der Objektdatei die Exportdirektive hinzugefügt, sodass keine DEF-Datei erforderlich ist.
das "int" vor dllTest ==> gibt den Rückgabewert der Funktion an !! hier wird es später noch interessant !
dllTest ==> Ist der Name der Funktion
(int a,int b) ==> sind die Parameter a und b welche in die Funktion übergeben werden.
Dies müssen nicht vorhanden Sein, können aber abcuh beliebig viele werden.
Wichtig ist hier nur, dass in AutoIt später genau die gleiche Anzahl, sowie der gleiche Typ übergeben wird.
--------------------------------------------------------------------------------------------
es ist Zeit für einen ersten Test
In der Titelleiste den Eintrag "Build" auswählen.
und dann auf "Build" klicken. ( Ctrl-F9 )
Die Dll wird erstellt.
schließen Sie das Programm Code Blox.
--------------------------------------------------------------------------------------------
gehen Sie in den von Ihnen angelegten Projektordner
bei mir "Test_autoit_Dll"
dort wird ein Ordner namens "bin" angezeigt.
öffnen sie diesen.
nun erscheint ein Ordner namens "debug".
Ebenfalls Öffnen.
hier liegt jetzt die Datei "Test_autoit_Dll.dll"
für AutoIt wird nur diese benötigt.
machen Sie einen Rechtsklich in den Ordner und öffnen Sie ein neues *.au3 File.
ich benenne es ebenfalls "Test_autoit_Dll.au3"
füllen Sie das projekt mit folgendem Code:
;; ab hier
$dll = "Test_autoit_Dll.dll"
$result = DllCall($dll,"int:cdecl","dllTest","int",5,"int",6);
MsgBox(0,"Ergebniss","Das Ergebniss aus der DLL ist " &$result[0]);
;; bis hier
Speichern Sie das Script.
Testen Sie es.
Er wird der Text :
Das Ergebniss aus der DLL ist 11 erscheinen.
--------------------------------------------------------------------------------------------
Erklärung der Zeilen;
$dll = "Test_autoit_Dll.dll" ==> eine Variable welche den Namen der Dll speichert
( hier muss das Script im gleichen Ordner mit DLL liegen, ansonsten wird die Dll nicht gefunden. )
ausser man gibt den Relativen Pfad an.
$result = DllCall($dll,"int:cdecl","dllTest","int",5,"int",6); ==> das ergebniss des DLLCALL wird in die
Variable $result hinein geschrieben.
DllCall ist die Dll funktion, die Variable $dll gibt die Dll an,
"int:cdecl" !!!!! sehr wichtig ! gibt an in welcher Reihenfolge die Funktion übergeben wird, und welcher
RückgabeTyp geliefert wird. !!
"dllTest" ==> ist der name der Gewünschten Funktion
"int",5 ==> der erste Parameter, bestehend aus Typ und Wert
"int",6 ==> der zweite Parameter bestehend aus Typ und Wert
MsgBox(0,"Ergebniss","Das Ergebniss aus der DLL ist " &$result[0]); ==> ist eine Messagebox mit Text
Hier wichtig, die Variable $result wird als Array zurückgeliefert. Der Rückgabewert steht in [0]
also muss $result[0] als Variable angegeben werden.
--------------------------------------------------------------------------------------------
.... SO !! das war's für's erste ..
würde mich über feedback freuen ..
MFG
Bye
Vi