Nach (DLL-)Funktion -> Exit

  • Ich habe folgenden Code:

    [autoit]

    #AutoIt3Wrapper_usex64=n
    $dll = DllOpen(@ScriptDir & "\API.dll")
    HotKeySet("{F3}","ACM")
    Func AddChatMessage($Color, $Text)
    $ret = DllCall($dll, "int", "API_AddChatMessage", "int", $Color, "str", $Text)
    Return $ret[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func IsChatOpen()
    $ret = DllCall($dll,"int","API_IsChatOpen")
    Return $ret[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    While True
    Sleep(100)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func ACM()
    AddChatMessage(0xFFFFFF,"AddChatMessage-Test - @error returned: " & @error)
    EndFunc

    [/autoit]


    Funktioniert ja alles, nur, wenn ich nun F3 drücke, wird die Funktion 1 mal ausgeführt und das (AutoIt-)Programm schließt sich, mit folgenden Daten in der Konsole:

    Code
    Starte Datei Griffins_GRP_Keybinder.au3...
    
    
    Griffins_GRP_Keybinder.au3 -> Exit Code: -1073741819	(Laufzeit: 5.95 sec)


    Bei @error wird auch nur 0 zurückgegeben, nur der Exit Code ist komisch, kann mir hierbei jemand evtl. helfen?
    Danke im Vorraus!

    Mit freundlichen Grüßen
    munkee

  • Und nun? Dein Script ist unvollständig. Woher sollen wir wissen was deine ominöse API.dll tut. Vermutlich hast du auch noch Autoit Code unterschlagen, denn ich sehe z.B. keine Möglichkeit das Script überhaupt zu beenden. Ein dllclose() fehlt btw auch und sollte grundsätzlich gemacht werden wenn man mit dlls arbeitet.

  • Die DLL ist eine API für einen externen GTA San Andreas Multiplayer Clienten, durch die API ist es möglich Keybinder sowie Overlays zu erstellen, die schneller und sicherer funktionieren, mehr dazu findet man hier: Samp-Api Wiki

    Eine GUI ist noch nicht drin, deshalb hat man noch keine Möglichkeit das Programm zu beenden, wird aber eingefügt sobald die Funktion überhaupt funktioniert.

    Das DllClose habe ich eben aus Testgründen weg gemacht, habe es allerdings beim einfügen ins Forum vergessen wieder rein zu schreiben.

    Hoffe das hilft weiter.

    Mit freundlichen Grüßen
    munkee

  • 100% legal, funktionen wie Geld geben etc. gibt es nicht, somit auch keine Hack-/Cheatware.

    Willst du mir sagen wo der Fehler liegt? :D

  • Naja ich würde mal vermuten es liegt an deinem Datentyp von $color. Ich arbeite zwar normal nicht mit dlls, aber du verwendest in deiner Funktion die den dllcall macht "int" als Datentyp, übergibst aber für $color einen hex-wert.

  • Naja ich würde mal vermuten es liegt an deinem Datentyp von $color. Ich arbeite zwar normal nicht mit dlls, aber du verwendest in deiner Funktion die den dllcall macht "int" als Datentyp, übergibst aber für $color einen hex-wert.

    Und wenn es daran liegen würde, würde die Funktion erst garnicht ausgeführt werden, bei mir wird sie ein mal ausgeführt und direkt beendet.

  • Ok dann nehme ich das zurück. Hex-Schreibweise entspricht wohl einem Integer:

    Zitat


    Integer (ganze Zahlen) können gleichwohl in hexadezimaler Schreibweise repräsentiert werden, dem Integer voranstellend 0x wie in 0x409 oder 0x4fff (wenn Hex-Notation genutzt wird sind nur 32-bit Zahlen gültig).

  • Ich grab das Thema mal aus.
    Ich habe nun folgenden Code:

    [autoit]


    $dll = DllOpen("API.dll")
    If @error Then
    MsgBox(48, "API - Fehler", "Die API.dll konnte nicht gefunden werden." & @CRLF & "Der Keybinder wird nun beendet. - Error = " & @error)
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $hModule = DllCall($dll, "UINT", "LoadLibrary", "str", "API.dll")
    ;DllCall(

    [/autoit][autoit][/autoit][autoit]

    If($hModule == -1 Or $hModule == 0) Then
    MsgBox(48, "API - Fehler", "Die API.dll konnte nicht gefunden werden." & @CRLF & "Der Keybinder wird nun beendet. - hModule = " & $hModule)
    Exit
    EndIf

    [/autoit]

    Diese sieht in AHK so aus:

    Code
    hModule := DllCall("LoadLibrary", Str, A_ScriptDir . "\API.dll")
    if(hModule == -1 || hModule == 0)
    {
    	MsgBox, 48, API - Fehler, Die API.dll konnte nicht gefunden werden.`nDer Keybinder wird nun beendet.
    	ExitApp
    }

    Folgendes Problem:
    $hModule returnt 0, was heißt, dass die API.dll nicht in dem Verzeichnis ist, allerdings ist sie in dem Verzeichnis, was auch durch das @error beim DllOpen bestätigt wird (@error = 0), was habe ich hierbei Falsch gemacht? Laut dem Entwickler der API returnt LoadLibrary UINT.

    /e: Die Variante mit cdecl habe ich ebenfalls schon versucht, allerdings ohne Erfolg.