C-Dll's generieren und mit Autoit ansprechen

  • 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

    Einmal editiert, zuletzt von vivus (5. April 2011 um 15:16)

  • Klingt interessant, probieren werde ich es am WE mal.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Deine viel zu vielen Leerzeilen machen den Text echt extrem schwer zu lesen, außerdem könntest du wenigstens die Codestellen mit einem Syntax versehen.

    Und was diese ################################################# andauernd sollen muss man wohl auch nciht verstehen.

    Eindeutig :thumbdown::thumbdown::thumbdown:

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • mach bitte ein paar leerzeilen weg, da hat darter recht, aber die rauten (#) sind zur abtrennung, was man normalerweise auch verstehen kann ;)

  • Es sind ja nicht nur die Leerzeilen, sondern die allgemeine Formatierung des Textes.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Huhu Darter

    es ist doch erstmal nett wenn jemand etwas Wissenswertes beisteuert.
    Generell ist mir ein funktionelles Readme liebar als ein superstylisches *docx oder sonst was, wenn es am Inhalt hapert.
    Also werde/würde ich es erst einmal ausprobieren bevor ich die Formatierung zerreisse.

    Wenn man da etwas optimieren möchte, es gibt noch FETT und unterstrichen usw.
    Damit wird es vermutlich noch lesbarer. Zum Beispiel um die "Überschriften" hervorzuheben.

    Ansonsten wenn jedem direkt solche kleinen Schönheitsfehler vorgeworfen werden,
    wundere ich mich das überhaupt noch wer postet.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (6. April 2011 um 09:38)

  • Ich will ja niemanden anprangern, aber ein Tutorial was fast komplett gleich ist exisitert im bösen Forum schon seit Anfang 2009.

    Code
    //böses Forum
    extern "C" double __declspec(dllexport) add (double a, double b)
    {
        return a+b;
    }


    Allein der Titel sagt schon alles:
    Hier: C-Dll's generieren und mit Autoit ansprechen
    böses Forum: Dll mit C++ erstellen und in AutoIt nutzen

  • *hust*
    wenn man davon ausgeht, dass wesentlich mehr auf "unser" Forum von der dunklen Seite der Macht verlinkt wird als umgekehrt, wäre ein Link nach "drüben" in diesem Fall auch nicht verkehrt gewesen.
    Da hats teilweise sehr schöne Tut´s, die nicht primär mit Bots zu tun haben, wieso die Arbeit dieser Leute nicht durch einen Link dorthin würdigen?

  • Zitat

    wenn man davon ausgeht, dass wesentlich mehr auf "unser" Forum von der dunklen Seite der Macht verlinkt wird als umgekehrt, wäre ein Link nach "drüben" in diesem Fall auch nicht verkehrt gewesen.


    Ich habe irgendwo gelesen, dass es verboten ist Links zum bösen Forum zu posten, weil ihr euch komplett gegenüber Bots abgrenzen wollt.
    Hier gehts zum Tutorial
    Ich habe gar nicht gedacht, dass sich da überhaupt jemand für interessiert... Ich finde es nur recht nervig, wenn Leute dreist Skripte/sonstige Texte von anderen klauen und sie neu posten. Das ist einfach assig. Man kann ja ruhig auch mal dazu schreiben, von wo/wem man die Informationen hat.

    €dit:

    Zitat

    Bitte unterlasse solche Unterstellungen.
    Ich sehe hier nichts geklautes.


    Dann hast du anscheinend eine andere Meinung. Der Text ist anders, aber ansonsten wurden die Beispiele fast 1:1 kopiert.
    Allerdings ist es extrem sinnlos darüber zu diskutieren, weil eh jeder auf seiner Meinung beharren wird.

    Einmal editiert, zuletzt von @night@ (7. April 2011 um 16:39)

  • Ich finde es nur recht nervig, wenn Leute dreist Skripte/sonstige Texte von anderen klauen und sie neu posten.

    aber ein Tutorial was fast komplett gleich ist exisitert im bösen Forum schon seit Anfang 2009.


    Bitte unterlasse solche Unterstellungen.
    Ich sehe hier nichts geklautes.
    Das die Vorgehensweise gleich ist ist logisch - so schreibt man nunmal Dlls.
    Wenn du mit der Logik rangehst nur weil schonmal einer extern "C" und __declspec(dllexport) (das ist die wichtigste Information beim Schreiben von Dlls) vorher verwendet hat dies dann automatisch ein Plagiat ist dann ist das von dir verlinkte Tutorial ebenfalls geklaut da (man staune) schon vorher jemand soetwas schonmal gemacht hat: >>Link<<
    Also Ball flach halten - ich sehe hier nichts als geklaut an.
    Es ist völlig anders und auch ausführlicher geschrieben.

    In beiden Tutorials sollte man vielleicht auch mal darauf hinweisen das AutoIt standardmäßig stdcall als Aufrufkonvention verwendet anstatt, das hier erstellte, cdecl und man durchaus auch gleich direkt stdcall-Dlls schreiben kann.