• Hallo,

    die angekündigte LUA-udf ist so einigermaßen fertig. Es gibt noch Probleme, für die ich aber noch keine Lösung gefunden habe. Vielleicht weiß jemand anderes die Ursache.
    Es ist möglich von AutoIt aus die LUA-skripte auszuführen, globale Variablen zu setzen und auszulesen, sowie LUA-funktionen aufzurufen. Neue Funktionen zu definieren ist geplant, geht aber noch nicht.
    In dem Archiv sind zwei DLLs für 32 bit und 64 bit.
    LUA.au3 ist die UDF
    1.au3 ist ein Beispiel
    1.lua ist ein Beispielskript
    1.out ist 1.lua in kompilierter Form

    Bugs und Probleme:

    • in 64-bit-dll geht _LUA_PushNumber nicht. Es wird immer 0 auf den Stack geschoben. Ich hab aber keine Source von der 64-bit dll
    • Registrieren von neuen Funktionen geht nicht
    • Fehlermeldungen in LUA-skripten werden nicht angezeigt
    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include "LUA.au3"

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

    $lua = _LUA_Open() ; LUA öffnen

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

    _LUA_OpenDefaultLibs($lua) ; Standart-module hinzufügen (sonst geht print nicht)

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

    _LUA_Push($lua, "number", 666) ; Wert 666 auf Stack schieben (Statt number geht auch integer oder string; das Ergebnis ist gleich)
    _LUA_SetGlobal($lua, "Variable_1") ; Dem Wert auf dem Stack (666) einen Variablennamen zuweisen

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

    _LUA_RunFile($lua, "1.lua") ; Datei ausführen

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

    _LUA_GetGlobal($lua, "PrintMessage") ; Variable (hier Funktion) auf Stack schieben (wurde im Skript definiert)
    _LUA_Push($lua, "string", "Sent by AutoIt") ; Parameter auf Stack schieben
    _Lua_Call($lua, 1, 0) ; Funktion ausführen mit 1 Parameter und 0 Rückgabewerten

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

    ; Achte auf Konsolenausgabe

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

    _LUA_GetGlobal($lua, "name") ; Globale Variable name auf Stack schieben (wurde im Skript definiert)
    MsgBox(0, "", _Lua_ToString($lua, 1)) ; Stack mit index 1 (die Variable) als String in AutoIt ausgeben und in MessageBox anzeigen
    _LUA_Pop($lua, 1) ; Unnütze Variable name wieder vom Stack löschen

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

    _LUA_GetGlobal($lua, "Variable_1") ; Globale Variable Variable_1 auf Stack schieben (wurde in AutoIt definiert und im Skript verändert)
    MsgBox(0, "", _Lua_ToNumber($lua, 1)); Stack mit index 1 (die Variable) als Float in AutoIt ausgeben und in MessageBox anzeigen

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

    _LUA_Close($lua) ; LUA beenden

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

    ; Statt _LUA_Pop($lua, 1) hätte man auch Variable auf Stack lassen können und später andere Variable mit _Lua_ToNumber($lua, 2) auslesen können

    [/autoit]


    Spoiler anzeigen
    Code
    function PrintMessage(text) --function definieren (wird von AutoIt aufgerufen)
    	print("This is a message: "..text) --Text mit Parameter verbinden und beides ausgeben
    end
    
    
    name = "LUA-skript" -- neue Variable definieren
    
    
    Variable_1 = Variable_1*2 -- bereits definierte Variable verändern


    DOWNLOAD: autoit.de/wcf/attachment/13162/

  • Super, mach weiter so ;)

    Zitat

    Registrieren von neuen Funktionen geht nicht
    Fehlermeldungen in LUA-skripten werden nicht angezeigt


    Im Anhang hab ich die Lösung gefunden. Nebenbei hab ich ein paar Fehler repariert, die ich gefunden hab.

    Edit: LUA verwendet standardmäßig int_ptr als Datentyp für Integer, das ist auch korrigiert. Warum _PushNumber nicht läuft weiß ich nicht und ich hab grad keine Lust, meine 64-bit Maschine anzuschalten.