Jump to content

Recommended Posts

Posted

Hello,

I've read a article about lua functions here: https://debian-administration.org/article/264/Embedding_a_scripting_language_inside_your_C/C_code

There are two ways of include lua scripts to your AutoIt code.

1. Run lua functions by Autoit.

2. Register Autoit function and run as lua.

It's even possible to apply second way to AutoIt?

As we can see on example there a few functions to make it possible.

It's a lua file save as average.lua

avg, sum = average(10, 20, 30, 40,  50)

print("The average is ", avg)
print("The sum is ", sum)

This is a C functions to run lua. Can be convert to AutoIt ofc.

There is a problem with func lua_register(L, "average", average)

this function is not even detected in Lua51.dll

We can use lua_pushcclosure instead.

#include <stdio.h> 

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

/* the Lua interpreter */
lua_State* L;

/* The function we'll call from the lua script */
static int average(lua_State *L)
{
        /* get number of arguments */
        int n = lua_gettop(L);
        double sum = 0;
        int i;

        /* loop through each argument */
        for (i = 1; i <= n; i++)
        {
                if (!lua_isnumber(L, i)) 
                {
                      lua_pushstring(L, "Incorrect argument to 'average'");
                      lua_error(L);
                }

                /* total the arguments */
                sum += lua_tonumber(L, i);
        }

        /* push the average */
        lua_pushnumber(L, sum / n);

        /* push the sum */
        lua_pushnumber(L, sum);

        /* return the number of results */
        return 2;
}


int main ( int argc, char *argv[] )
{
        /* initialize Lua */
        L = lua_open();

        /* load Lua base libraries */
        lua_baselibopen(L);

        /* register our function */
        lua_register(L, "average", average);

        /* run the script */
        lua_dofile(L, "average.lua");

        /* cleanup Lua */
        lua_close(L);

        return 0;
}

 

 

 

  • Developers
Posted (edited)
  On 11/14/2018 at 10:59 AM, Earthshine said:

Is there a question? This is the gelp forum

Expand  

Yes... Gelp? ;)

  On 11/14/2018 at 10:46 AM, Ascer said:

It's even possible to apply second way to AutoIt?

Expand  

Jos

Edited by Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Posted (edited)

This is an another example from autoit site.

  Reveal hidden contents

Im guess that problem is in pushing parameter $lua_CFunction into DLLCALL func see below.

Func lua_pushcclosure($lua_CFunction, $index = 0, $p_state = 0)

    If Not _Lua_Initiate() Then Return SetError(-1, 0, 0)

    If $p_state = 0 Then $p_state = $__g_pluanewstate

    Local $aRet = DllCall($__g_hluadll, "none:cdecl", "lua_pushcclosure", "ptr", $p_state, "str", $lua_CFunction, "int", Int($index))
    
    If @error Then Return @error

    Return 1

EndFunc

How to push param such as function ?

We have a function:

Func Jos()
    
    lua_pushstring("Jos")
    
    Return 1
    
EndFunc

When i push like this no error but also nothing happen.

lua_pushcclosure(Jos)

I've check var for Jos.

ConsoleWrite("jos: " & VarGetType(Jos) & @CRLF)
;==> return UserFunction

So.. how to pas UserFunction in dll

"str" ? UserFunction
Edited by Ascer
Posted (edited)
  Quote

lua_pushcfunction

[-0, +1, m]

void lua_pushcfunction (lua_State *L, lua_CFunction f);

Pushes a C function onto the stack. This function receives a pointer to a C function and pushes onto the stack a Lua value of type function that, when called, invokes the corresponding C function.

Any function to be registered in Lua must follow the correct protocol to receive its parameters and return its results (see lua_CFunction).

lua_pushcfunction is defined as a macro:

     #define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)
Expand  

http://www.lua.org/manual/5.1/manual.html#lua_pushcclosure

 

not sure why you are pushing string onto stack with pushstring.

Edited by Earthshine

My resources are limited. You must ask the right questions

 

Posted

@Earthshine 

Thanks for answer.

As autoit in lua documentation: https://www.autoitscript.com/autoit3/scite/docs/SciTE4AutoIt3/Lua/manual.html

   #define lua_register(L,n,f) \
               (lua_pushstring(L, n), \
                lua_pushcfunction(L, f), \
                lua_settable(L, LUA_GLOBALSINDEX))
     /* lua_State *L;    */
     /* const char *n;   */
     /* lua_CFunction f; */

I replaced it to autoIt code:

Tried many times..

This examples looks good but not working


lua_pushstring("Jos") ; push string to stack
lua_pushcclosure(Jos, 0) ; push function index default index 0
lua_setglobal("Jos") ; set global function

lua_pushstring("Jos") ; push string to stack
lua_pushcclosure(Jos, 0) ; push function index default index 0
lua_settable($LUA_GLOBALSINDEX) ; set global table index

Func Jos()
    lua_pushstring("sdfsdf")
    Return 0
EndFunc

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...