0

有没有可能只用 lua52.dll 文件编写一个可以执行 lua 脚本的程序?
还是我必须创建一个新的 C 项目并使用所有这些头文件和源文件?
我只想创建一些全局变量和函数,并让它们在应该执行的 lua 脚本中可用。
所以理论上:

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

2 回答 2

2

Lua 的标准命令行解释器就是这样一个程序的一个例子。在 Windows 上,它是一个链接到lua52.dll. 当然,它的来源是Lua 发行版的一部分。

尽管与 Lua DLL 的源代码位于同一文件夹中,但它lua.c仅引用 Lua 的公共 API,并且仅依赖于四个公共头文件和 DLL 本身。

下面是一个在 C 程序中嵌入 Lua 解释器的更简单的示例,它源自在线提供的 PiL 书中的示例

#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(). 加载脚本会对其进行编译,并在堆栈顶部留下一个匿名函数,该函数在调用时将执行脚本中的所有顶级语句。

有关这方面的更多讨论,请参阅与 C API 相关的 Lua 编程章节(可在线获得较旧的补充)。

于 2013-10-14T20:49:39.597 回答
1

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

以上是用什么语言写的?什么应用程序正在运行它?如果这是一个 Lua 脚本,那么“AddFunctionToLua”就是简单的function name() end. 如果这是 C,那么你已经有了一个 C 项目,不需要“创建一个新的 C 项目”。所以不清楚你在问什么。

于 2013-10-14T20:05:00.900 回答