Diese AHK Funktion in AutoIt

  • Ich habe folgende Funktion:

    Code
    IsChatOpen_func := DllCall("GetProcAddress", UInt, hModule, Str, "API_IsChatOpen")
    IsChatOpen()
    {
    	global IsChatOpen_func
    	Result := DllCall(IsChatOpen_func)
    	return Result
    }


    Will die gleiche Funktion aber in AutoIt haben, ich habe es schon selbst versucht, aber es sendet nur @error aus (Durch If @error Then MsgBox bla bla bla getestet), durch DllCall Tutorials sowie durch die Hilfe von AHK/AutoIt werde ich auch nicht schlauer.

    Wäre sehr nett wenn mir jemand sagen könnte wie diese Funktion in AutoIt geschrieben wird.
    Danke im Vorraus.

    *edit: formatierung...

  • Achja, mein eigener Versuch sieht so aus:

    [autoit]


    $dll = DllOpen("API.dll")

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

    Func IsChatOpen()
    $ret = DllCall($dll,"UINT","API_IsChatOpen")
    If @error Then
    MsgBox(0,"Error","Error und so")
    EndIf
    Return $ret
    EndFunc

    [/autoit]

    Ausgabe ist Error und so...

    (Habs nochmal geantwortet weil die Bearbeitungsfunktion nicht geht, lädt unendlich...

  • Hi,
    die Abfrage auf "Error","Error und so" ist so ziemlich das dämlichste, was es gibt...dass ein Fehler auftritt merkst du spätestens wenn etwas nicht wie vorgesehen funktioniert!
    Wenn schon ein Fehler auftritt, dann ist es clever, den Fehlercode abzufragen/auszugeben, der gibt dir jedenfalls schon reichlich Hinweise, was mit der Funktion bzw. deren Parametern nicht stimmt.
    Schon mal in die Hilfe zu den einzelnen Funkltionen geschaut?
    In so gut wiejeder Funktion gibt es Rückgabewerte bzw auch @error-codes:


    Würdest du den @error abfragen (Cursor auf die Variable => Siehe Scite/Extras Debug To Msgbox / Debug to Console oder Ctrl+Shift+D (Alt+D)) dann hast du schon den ersten Hinweis wo der Fehler liegt.

    Welcher Fehler tritt bei dir auf?
    Ist die Dll ggf. eine .Net-Dll?
    Poste die Beschreibungen zu dieser Dll oder die entsprechenden *.h-Dateien.
    Im Zweifelsfall hänge die Dll einfach an deinen Post an, dann kann man mit den entsprechenden Viewern/Debuggern mal in die Dll reinschauen und wenigstens die Anzahl der Parameter und deren Format/Typ bestimmen.

    In dem von dir geposteten Quellcode wird im ersten Call die Speicher-Adresse der Funktion bestimmt und im 2. Call dann angesprungen. Das scheint in letzter Zeit in Mode gekommen zu sein, um abhängig vom Betriebssystem und 32/64Bit Architektur trotzdem nur eine Datei verwenden zu können/wollen/müssen.
    Also poste bei derartigen Anfragen dein BS und ob 32- oder 64Bit-System.

    Nur mit genauen Angaben von dir KANN hier geholfen werden, je genauer und je besser deine Anfrage, desto eher wird dir geholfen werden....ich kenne jedenfalls schon mindestens 20 Spezialisten für dein Problem hier im Forum, die aufgrund deines 1. Posts KEINESFALLS antworten werden....s.o.!
    Die verplempern nicht ihre Freizeit, nur um dir die Würmer aus der Nase zu ziehen!

    Also hau rein, damit das beim nächstenm Mal besser klappt :thumbup:

  • So, habe deinen Ratschlag mal befolgt, folgender Code:

    [autoit]


    $dll = DllOpen("API.dll")

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

    Func AddChatMessage($Color, $Text)
    $ret = DllCall($dll, "UINT", "API_AddChatMessage", "int", $Color, "str", $Text)
    If @error == 1 Then
    MsgBox(0,"Error","Die Dll-Datei kann nicht verwendet werden")
    ElseIf @error == 2 Then
    MsgBox(0,"Error","unbekannter Rückgabewert - return type")
    ElseIf @error == 3 Then
    MsgBox(0,"Error","Funktion wurde in der DLL-Datei nicht gefunden")
    ElseIf @error == 4 Then
    MsgBox(0,"Error","Falsche Anzahl von Parametern.")
    ElseIf @error == 5 Then
    MsgBox(0,"Error","Falscher Parameter.")
    EndIf
    Return $ret
    EndFunc

    [/autoit]


    Rückgabe ist 1 ("Die Dll-Datei kann nicht verwendet werden").

    Die DLL besitzt eine eigene Wikiseite, diese findet sich hier: KLICK
    Dort ist eine Include sowie Dokumentation der Funktionen vorhanden, ich denke das sollte das sein, worauf du hinaus wolltest, ich hoffe ihr könnt mir so besser helfen.

    Mit freundlichen Grüßen
    munkee

  • Hi,

    probiere mal das hier:

    Spoiler anzeigen
    [autoit]

    $dll = DllOpen("API.dll")

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

    If ($dll == -1) Then
    MsgBox(0,"Error","DllOpen fehlgeschlagen !")
    Exit (-1)
    EndIf

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

    Func AddChatMessage($Color, $Text)
    $ret = DllCall($dll, "BOOL:cdecl", "API_AddChatMessage", "DWORD", $Color, "str", $Text)
    If @error == 1 Then
    MsgBox(0,"Error","Die Dll-Datei kann nicht verwendet werden")
    ElseIf @error == 2 Then
    MsgBox(0,"Error","unbekannter Rückgabewert - return type")
    ElseIf @error == 3 Then
    MsgBox(0,"Error","Funktion wurde in der DLL-Datei nicht gefunden")
    ElseIf @error == 4 Then
    MsgBox(0,"Error","Falsche Anzahl von Parametern.")
    ElseIf @error == 5 Then
    MsgBox(0,"Error","Falscher Parameter.")
    Else
    Return $ret[0]
    EndIf
    EndFunc

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

    DllClose ($dll)

    [/autoit]


  • DllOpen ist fehlgeschlagen, aber wieso? Ordnerstruktur sieht wie folgt aus:
    [Blockierte Grafik: http://i.imgur.com/bxUoMwR.png]

    Was mache ich falsch? DllOpen mit @ScriptDir hab ich auch schon versucht, gleiches Problem.

  • Hi,

    Zitat

    Also poste bei derartigen Anfragen dein BS und ob 32- oder 64Bit-System.

    6. setzen....

    Ich wette auf ein 64Bit BS, daher wäre es sinnvoll

    [autoit]

    #AutoIt3Wrapper_usex64=n

    [/autoit]

    als oberste Zeile in dein script zu setzen, die Dll ist eine 32Bit!

    [autoit]

    $dll = DllOpen("API.dll")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dll = ' & $dll & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $ret = DllCall($dll, "uint:cdecl", "API_GetScreenSizeX");, "int", 0x123456, "str", "Text")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _arraydisplay($ret)
    $ret = DllCall($dll, "uint:cdecl", "API_AddChatMessage", "int", 0xFF123456, "str", "Text")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _arraydisplay($ret)

    [/autoit]

    funktioniert bei mir einwandfrei, bis auf die Tatsache, dass ich kein GTA-SA installiert habe^^

    Btw, der Rückgabewert des DLL-Calls ist ein array, daher $ret[0]
    Fürs debuggen ist das Arraydisplay SEHR hilfreich, zeigt es doch die Ein- und Rückgabeparameter.

  • Windows 7 x64, hab das mal ausprobiert, allerdings wird die DLL bei mir trotzdem nicht geöffnet wenn ich die normalen Funktionen.

    Auch beim Debugging wird mir angezeigt:
    @@ Debug(5) : $dll = -1 (DllOpen...)

    bzw ganzer code:

    @@ Debug(5) : $dll = -1
    >Error code: 0
    @@ Debug(8) : $ret = 0
    >Error code: 1
    @@ Debug(11) : $ret = 0
    >Error code: 1

    ---

    Irgendwie funktioniert es nur bei mir nicht...

  • [autoit]

    #AutoIt3Wrapper_usex64=n
    $dll = DllOpen("API.dll")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dll = ' & $dll & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $ret = DllCall($dll, "uint:cdecl", "API_GetScreenSizeX");, "int", 0x123456, "str", "Text")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _arraydisplay($ret)

    [/autoit]

    zuerst muss die dll geöffnet werden, ansonsten passiert garnichts....
    Hast du #AutoIt3Wrapper_usex64=n definitiv in deinem Script?

  • Ja ist es, und soeben habe ich erfahren dass es ein Trashrelease ist, die API funktioniert nicht auf jedem Rechner, somit wäre das Problem gelöst (Ist ja auch komisch, immerhin ging die Version davor noch perfekt), somit wäre es geklärt, ich bedanke mich bei allen die sich die Mühe gemacht haben, ihr seid Super! :thumbup:

  • urgs....Fehler meinerseits^^
    Ich hatte die 0.8.1 downgeloadet, da die 8.2 nicht online war....und mit der 0.8.1 sollte alles funktionieren