是否可以编写一个只能使用lua52.dll文件执行lua脚本的程序?
或者我是否必须创建一个新的C项目并使用所有这些头文件和源文件?
我只想创建一些全局变量和函数,并在应该执行的lua脚本中使它们可用
所以在理论上:
LoadDll("lua52.dll")
StartLua()
AddFunctionToLua("MyFunction1")
AddFunctionToLua("MyFunction2")
AddVariableToLua("MyVariable1")
...
ExecuteLuaScript("C:\myScript.lua")
CloseLua()
答案 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 Lua(older 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;。所以你不清楚你在问什么。