1 (2019-08-01 13:56:46 отредактировано swerg)

Тема: Своя DLL для Lua: как реализовать работу my = require('mylib')

Во всех нормальных DLL библиотеках для Lua доступен такой синтаксис подключения / использования:

my = require('mylib')

my.метод_из_dll()

Т.е. не зависимо от того, в какое пространство имён добавляется сама библиотека в рамках своего кода (во втором параметре при вызове luaL_register), к методам библиотеки можно получить доступ через присвоение своей переменной при результата вызова require(), в приведённом тут примере - через my.

Но я не понимаю как это сделано! Ни в одной сделанной мной библиотеке этого не происходит.
Изучение других библиотек понимания тоже не добавляет.

Кто знает - приведите пример, пожалуйста, как должно выглядеть наполнение функции luaopen_XXX(), чтобы указанный синтаксис в Lua срабатывал?

Я пишу просто:

static struct luaL_reg lib_functions[] = {
    {"SetVar", lua_SetVar},
    {"GetVar", lua_GetVar},
    {"SetVarList", lua_SetVarList},
    {"GetVarList", lua_GetVarList},
    {"UseNameSpace", lua_UseNameSpace},
    {"GetCurrentNameSpace", lua_GetCurrentNameSpace},
    {nullptr, nullptr}
};

LUAW32_API  int luaopen_StaticVar(lua_State *L)
{
    luaL_register(L, "stv", lib_functions);

    return 0;
}

Но тогда только так:

my = require('StaticVar')

stv.метод_из_dll()  -- < -- так работает, явно указано имя из вызова luaL_register

my.метод_из_dll()  -- < -- так НЕ работает, "нет метода"

Что еще надо добавить в luaopen_StaticVar(), чтобы через my тоже заработало?

2

Re: Своя DLL для Lua: как реализовать работу my = require('mylib')

swerg пишет:

Что еще надо добавить в luaopen_StaticVar(), чтобы через my тоже заработало?

может return 0 заменить на return stv? по принципу модулей луа.

3 (2019-08-03 17:33:55 отредактировано swerg)

Re: Своя DLL для Lua: как реализовать работу my = require('mylib')

Вы конечно будете очень смеяться, но я наконец-то прочел справку smile
Читал я её и раньше, но наконец-то прочел вдумчиво.
Всё оказалось столь просто, что даже неприлично:

When it returns, luaL_openlib leaves on the stack the table wherein it opened the library. The luaopen_mylib function returns 1 to return this value to Lua. (As with Lua libraries, this return is optional, because the library is already assigned to a global variable. Again, like in Lua libraries, it costs nothing, and may be useful occasionally.)

Т.е. надо всего лишь заменить возвращаемое из luaopen_StaticVar значение на 1 (вместо 0):

LUAW32_API  int luaopen_StaticVar(lua_State *L)
{
    luaL_register(L, "stv", lib_functions);

    return 1;
}

Важно: так просто только в том случае, если непосредственно перед выходом из luaopen_XXX идёт вызов luaL_register() (оно же luaL_openlib по-старому), т.к. luaL_register()  оставляет после себя на стеке таблицу с функциями библиотеки (см. цитату из документации выше).

Т.е. в этом смысле  luaopen_XXX вероятно  полностью эквивалентна любой другой функции С, вызываемой из Lua, т.е. возвращаемое из неё число есть количество оставленных на стеке результатов, которые можно присвоить результирующим переменным для данного вызова из Lua.

Странно, я был уверен, что проверял такой вариант ранее...

4

Re: Своя DLL для Lua: как реализовать работу my = require('mylib')

Прикольно)