通过dll调用实现lua脚本?

通过dll调用实现lua脚本?,dll,lua,Dll,Lua,是否可以只使用lua52.dll文件编写一个可以执行lua脚本的程序? 或者我必须创建一个新的C项目并使用所有这些头文件和源文件吗? 我只想创建一些全局变量和函数,并使它们在应该执行的lua脚本中可用。 因此,理论上: LoadDll("lua52.dll") StartLua() AddFunctionToLua("MyFunction1") AddFunctionToLua("MyFunction2") AddVariableToLua("MyVariable1") ... ExecuteL

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

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

ExecuteLuaScript(“C:\myScript.lua”)
CloseLua()

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

LoadDll(“lua52.dll”)
startua()
AddFunctionToLua(“MyFunction1”)
AddFunctionToLua(“MyFunction2”) AddVariableToLua(“MyVariable1”)

ExecuteLuaScript(“C:\myScript.lua”)
CloseLua()

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

LoadDll(“lua52.dll”)
startua()
AddFunctionToLua(“MyFunction1”)
AddFunctionToLua(“MyFunction2”) AddVariableToLua(“MyVariable1”)

ExecuteLuaScript(“C:\myScript.lua”)
CloseLua()

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

LoadDll(“lua52.dll”)
startua()
AddFunctionToLua(“MyFunction1”)
AddFunctionToLua(“MyFunction2”) AddVariableToLua(“MyVariable1”)

ExecuteLuaScript(“C:\myScript.lua”)
CloseLua()


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

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

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

在C程序中嵌入Lua解释器的一个更简单的示例如下所示,源自:

#包括
#包括
#包括
#包括
#包括
内部主(空){
字符buff[256];
整数误差;
lua_State*L=luaL_newstate();/*创建状态*/
luaL_openlibs(L);/*开放标准库*/
while(fgets(buff,sizeof(buff),stdin)!=NULL){
错误=luaL_加载缓冲区(L,buff,strlen(buff),“行”)||
lua_pcall(L,0,0,0);
如果(错误){
fprintf(标准,“%s”,lua_tostring(L,-1));
lua_pop(L,1);/*从堆栈中弹出错误消息*/
}
}
卢厄关闭(L);
返回0;
}
在现有应用程序中,需要调用
luaL\u newstate()
一次并存储返回的句柄。除了调用
luaL\u openlibs()
,您可能还需要定义一个或多个表示应用程序可编写脚本的API的Lua模块。当然,您需要在退出之前调用
lua\u close()
,这样lua就有机会清理其对象,特别是有机会处理脚本作者在应用程序退出时释放资源所依赖的任何对象

有了它,您通常可以使用
lua\u loadbuffer()
或构建在
lua\u load()之上的其他任何函数来加载用户提供的脚本片段。加载脚本会对其进行编译,并在堆栈顶部留下一个匿名函数,调用该函数时将执行脚本中的所有顶级语句


有关这方面的更多讨论,请参阅(an)中与C API相关的章节。

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

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

在C程序中嵌入Lua解释器的一个更简单的示例如下所示,源自:

#包括
#包括
#包括
#包括
#包括
内部主(空){
字符buff[256];
整数误差;
lua_State*L=luaL_newstate();/*创建状态*/
luaL_openlibs(L);/*开放标准库*/
while(fgets(buff,sizeof(buff),stdin)!=NULL){
错误=luaL_加载缓冲区(L,buff,strlen(buff),“行”)||
lua_pcall(L,0,0,0);
如果(错误){
fprintf(标准,“%s”,lua_tostring(L,-1));
lua_pop(L,1);/*从堆栈中弹出错误消息*/
}
}
卢厄关闭(L);
返回0;
}
在现有应用程序中,需要调用
luaL\u newstate()
一次并存储返回的句柄。除了调用
luaL\u openlibs()
,您可能还需要定义一个或多个表示应用程序可编写脚本的API的Lua模块。当然,你需要
#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;
}