2013-10-14 4 views
0

Можно ли написать программу, которая может выполнять сценарии lua, только используя файл lua52.dll?
Или мне нужно создать новый проект C и использовать все эти заголовки и исходные файлы?
Я просто хочу создать несколько глобальных переменных и функций и сделать их доступными в сценариях lua, которые должны быть выполнены.
Таким образом, в теории:Внедрить lua скрипты через вызовы dll?

LoadDll("lua52.dll") 
StartLua() 
AddFunctionToLua("MyFunction1") 
AddFunctionToLua("MyFunction2") 
AddVariableToLua("MyVariable1") 
... 
ExecuteLuaScript("C:\myScript.lua") 
CloseLua() 
+0

С надлежащими макросами приведенный выше код можно превратить в действительный код C, который вызывает Lua API. Но этот код C еще нужно скомпилировать в ваше приложение. И функции, которые вы экспортируете в Lua, должны быть тем, что ожидает Lua API, хотя вы, вероятно, можете избежать этого, используя FFI, например, в LuaJIT. – lhf

+1

Да, и ваш MyFunction1 и т. Д. Могут быть написаны на C, C++, C# и т. Д., Java и, конечно же, Lua. Я полагаю, вы имели в виду.Вы получите более качественные ответы, если вы скажете, что и дать больше контекста. –

ответ

2

Стандартный интерпретатор командной строки для Lua является примером такой программы. В окнах это небольшой исполняемый файл, который связан с lua52.dll. Его источником является, конечно, часть the Lua distribution.

Несмотря на то, что он находится в той же папке, что и источники Lua DLL, lua.c ссылается только на общедоступный API для Lua и зависит только от четырех общих файлов заголовков и самой DLL.

Еще более простой пример, который встраивает интерпретатор Lua в программе C заключается в следующем, полученный из the example shown in the PiL book available online:

#include <stdio.h> 
#include <string.h> 
#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 

int main (void) { 
    char buff[256]; 
    int error; 
    lua_State *L = luaL_newstate(); /* create state */ 
    luaL_openlibs(L);    /* open standard libraries */ 

    while (fgets(buff, sizeof(buff), stdin) != NULL) { 
     error = luaL_loadbuffer(L, buff, strlen(buff), "line") || 
       lua_pcall(L, 0, 0, 0); 
     if (error) { 
      fprintf(stderr, "%s", lua_tostring(L, -1)); 
      lua_pop(L, 1); /* pop error message from the stack */ 
     } 
    } 

    lua_close(L); 
    return 0; 
} 

В существующем приложении, вам нужно будет позвонить luaL_newstate() раз и хранить возвращенный дескриптор. Наряду с призывом к luaL_openlibs() вы, скорее всего, захотите также определить один или несколько модулей Lua, представляющих API-интерфейс, доступный для вашего приложения. И, конечно же, вам нужно позвонить lua_close() когда-нибудь, прежде чем выйти, чтобы у Lua была возможность очистить свои объекты и, в частности, возможность иметь дело с любыми объектами, которые авторы сценария зависят от того, чтобы получить ресурсы, выпущенные при выходе приложения.

С помощью этого места вы обычно предоставляете способ загрузить фрагменты скриптов, предоставленные вашим пользователем, используя luaL_loadbuffer() или любую другую функцию, созданную поверх lua_load(). Загрузка скрипта компилирует его и оставляет анонимную функцию в верхней части стека, которая при вызове будет выполнять все инструкции верхнего уровня в скрипте.

Подробнее об этом см. В главах Programming in Lua (older addition is available online), которые относятся к API C.

1

LoadDll ("lua52.dll")
StartLua()
AddFunctionToLua ("MyFunction1")
AddFunctionToLua ("MyFunction2") AddVariableToLua ("MyVariable1")
...
ExecuteLuaScript ("C: \ myScript.lua")
CloseLua()

На каком языке написано выше? Какое приложение запускает его? Если это сценарий Lua, то «AddFunctionToLua» - это просто function name() end. Если это C, то у вас уже есть проект C, нет необходимости «создавать новый проект C». Так что непонятно, что вы спрашиваете.

+0

Ну, я не решил, на каком языке я хочу это написать. Мне бы очень хотелось сделать это в AutoHotkey, но это было бы возможно только в том случае, если бы я мог использовать его через вызовы dll. – Forivin

Смежные вопросы