provlem mit DLL

  • huhu,

    ich habe vor ein paar tagen mit c++ angefangen und wollte jetzt mal ne kleine dll machen, die ich mit autoitm aufrufe
    nur, funtioniert das noch nicht so, wie ich das will

    [autoit]

    $dllhandle = DllOpen("dll.dll")
    $ergebnis = DllCall($dllhandle, "int","test","Int",2,"Int",38)
    DllClose($dllhandle)
    MsgBox(1,"test",$ergebnis[0])

    [/autoit]
    C
    int test(int a, int b){
    
        int c;
        c = a+b;
        return c;
        }

    wenn ich nur $ergebnis von der msgbox ausgeben lasse, kommt 0
    wenn ich $result[0] ausgeben lasse, kommt ein error, dass das kein array ist
    und @error ist 0

    was mach ich falsch, oder steh ich grade aufm holzweg?
    sry bin noch nen ziemlicher anfänger mit c++

  • Ich hätte eine Frage: welchen Compiler verwendest du? MinGW oder Visual C++?
    Die Funktion sollte zumindest bei VC++ so aussehen:

    Code
    extern "C" [[RÜCKGABETYP]] __declspec(dllexport) __stdcall [[FUNKTIONSNAME]]( [[PARAMETER]] )
    {
    ...
    }


    Beispiel:

    Code
    extern "C" int __declspec(dllexport) __stdcall addiere( int a, int b )
    {
        return a+b;
    }
    [autoit]

    $ergebnis = DllCall("meine.dll", "int","addiere","int",2,"int",38)
    MsgBox(, "", $ergebnis[0])

    [/autoit]
  • Bei mir geht das nicht, ich mach das folgendermaßen:

    Zuerst füg ich das Beispiel als DLL ein:

    DLL erstellen


    dann klick ich links bei meinen Projekten auf "DLL" (Rechtsklick) und drücke erstellen.
    Unten wird mir der Pfad der DLL angezeigt wohin die gespeichert wurde.
    Wenn ich jedpoch das Script oben von Progandy benutze sagt er, dass Ergebnis[0] nicht existiert.

    Was ab ch falsch gemacht? :/

  • hmm, na gut. Dann verwende eben __cdecl statt __stdcall und in AutoIt "int:cdecl","addiere"
    Es geht auch noch anders, aber das ist das einfachste.

    Edit: Die Alternative wenn man stdcall verwenden will, ist folgendes: Im EXPORTS-Abschnitt der .def-Datei müssen die Funktionsnamen aufgelistet werden.

    Einmal editiert, zuletzt von progandy (12. Oktober 2010 um 17:51)

  • Danke geht :)

    Noch eine Frage:
    Wie kann ich per DLL einfach eine MsgBox öffnen lassen?
    Also einfach per DLLCall ohne Parameter soll eine MessageBox mit Text aufploppen!

    Gibt aber 3 Errors X(

  • So geht es:
    C++ Source:

    Spoiler anzeigen
    Code
    #include <Windows.h>
    
    
    extern "C" int __declspec(dllexport) __cdecl messagebox()
    {
        return MessageBox(0, "Hello, World!", "Hello", 0);
    }


    AutoIt Aufruf:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_usex64=n ; Falls ein 64 Bit System verwendet wird
    $dll=DllOpen("Dll.dll")
    $aRet=DllCall($dll, "int:cdecl", "messagebox")
    DllClose($dll)

    [/autoit]


    Edit: Ich sollte vorm posten F5 drücken...