C++ DLL

  • Da eine von mir geschriebene Funktion in AutoIt zu langsam ist dachte ich mir ich schreibe sie in C++ speichere sie als DLL und benutze sie dann mit AutoIt.
    So da ich ihn C++ noch ein Anfänger bin hab ich mal angefangen und auch die Funktion fertigbekommen.Hab sie als DLL kompiliert mit MinGW und hab versucht sie mit AutoIt aufzurufen aber bekomme immer @error = 3 (Funktion nicht gefunden).

    C++ Code :

    Aufruf in AutoIt :

    [autoit]

    $call = DllCall (DllOpen("physx.dll"),"BOOL","RectCollision","int",100,"int",100,"int",100,"int",100,"int",100,"int",100,"int",100,"int",100)

    [/autoit]

    Warum funktioniert es nicht ?? Cpp falsch kompiliert ? ;) ? Fehler beim Aufruf ? oder Fehler im C++ Code ??
    Hoffe ihr könnt mir helfen ;) ^^

    • Offizieller Beitrag

    Hallo,

    ich habe deinen Quellcode mal so angepasst das man daraus auch einen DLL erstellen kann.

    test.c

    Mit folgenden Befehlen kann man aus dieser Datei eine, für AutoIt brauchbare DLL, erstellen.

    Zitat


    g++ -O3 -Wall -c -fmessage-length=0 -otest.o test.c
    g++ -s -Wl,--add-stdcall-alias -Wl,--kill-at -shared -otest.dll test.o

    Wichtig ist die Funktion DllMain, die zuminstest TRUE zurückgeben muß und das die Funktionen die man mit der DLL zur Verfügung stellen will auch veröffentlicht werden (__declspec(dllexport)).

    Edit: extern "C" - im Quellcode hinzugefügt

  • Hi,
    du hast vergessen die Funktion zu Exportieren und den Entrypoint der Dll zu erstellen.
    Ich bin jetzt zu faul das in c++ zu machen also hab ich dir das Projekt + funktionierender Dll in C# geschrieben
    Die Dll ist für 32Bit (x86) Systeme

  • Zitat

    Hi,
    du hast vergessen die Funktion zu Exportieren und den Entrypoint der Dll zu erstellen.
    Ich bin jetzt zu faul das in c++ zu machen also hab ich dir das Projekt + funktionierender Dll in C# geschrieben
    Die Dll ist für 32Bit (x86) Systeme

    Wo hast du das Projekt + funktionierende DLL ?

    Bernd : Ich hab es so versucht wie du meintest aber es funktioniert nicht aber ich denke auch dass ich irgendetwas falsch mache ;)
    Hab die DLL mal angehängt wie ich sie kompiliert habe :)
    Oder muss ich noch was im Aufruf ändern ? :P

    • Offizieller Beitrag

    Hallo,

    ich hatte im Quellcode noch die extern "C"-Option vergessen (Quellcode oben angepasst). Wichtig ist beim linken die Option "-Wl,--kill-at" damit die @-Zeichen aus den Funktionsnamen entfernt werden.

    Bei mir kommt angehängte DLL heraus, kannst es ja mal mit dieser probieren.

  • Danke Bernd die DLL funktioniert soweit ;)
    Edit : Problem gelöst ;) im Array [0] steht immer 0 oder 1 0 = False 1 = True ;)
    Damit wäre das gelöst und dieser Thread kann geclosed werden :P

    • Offizieller Beitrag

    Jetzt hab ich aber das nächste Problem ... Als Return bekomme ich ein Array mit acht Werten , also 8 mal 100 als Return ;(
    Hoffe ihr könnt mir weiterhelfen :thumbup: ^^

    Wiel lautet jetzt die Frage ?

  • Da eine von mir geschriebene Funktion in AutoIt zu langsam ist ...

    Und wie sieht es damit aus?:

    [autoit]


    Func _RectCollision($Rect1X1,$Rect1Y1,$Rect1X2,$Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
    ; Prog@ndy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1,1,$Rect1X1)
    DllStructSetData($1,2,$Rect1Y1)
    DllStructSetData($1,3,$Rect1X2)
    DllStructSetData($1,4,$Rect1Y2)
    DllStructSetData($2,1,$Rect2X1)
    DllStructSetData($2,2,$Rect2Y1)
    DllStructSetData($2,3,$Rect2X2)
    DllStructSetData($2,4,$Rect2Y2)
    Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
    If @error Then Return SetError(1,0,0)
    Return $r[0]<>0
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯