通过dll调用实现lua脚本?

时间:2013-10-14 14:17:24

标签: dll lua

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

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

2 个答案:

答案 0 :(得分:2)

Lua的标准命令行解释器就是这样一个程序的一个例子。在Windows上,它是一个链接到lua52.dll的小型可执行文件。它的来源当然是the Lua distribution的一部分。

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

在C程序中嵌入Lua解释器的更简单示例如下,派生自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()之上构建的任何其他函数提供的脚本片段。加载脚本会对其进行编译并在堆栈顶部留下一个匿名函数,该函数在调用时将执行脚本中的所有顶级语句。

有关此问题的更多讨论,请参阅与{API}相关的Programming in Luaolder addition is available online)章节。

答案 1 :(得分:1)

  

LoadDll(&#34; lua52.dll&#34)
  StartLua()
  AddFunctionToLua(&#34; MyFunction1&#34)
  AddFunctionToLua(&#34; MyFunction2&#34)   AddVariableToLua(&#34; MyVariable1&#34)
  ...
  ExecuteLuaScript(&#34; C:\ myScript.lua&#34)
  CloseLua()

上面写的是什么语言?运行什么应用程序?如果这是一个Lua脚本,那么&#34; AddFunctionToLua&#34;只是function name() end。如果这是C,那么你已经有了一个C项目,不需要&#34;创建一个新的C项目&#34;。所以你不清楚你在问什么。