使用Lua 5.1自定义DLL

我正在尝试从Lua内部使用自定义DLL。我有一个简单的DLL,例如:

extern "C"
{
  static int function_1(lua_State* L)
  {
    std::cout << "[DLL]这是一个自定义函数" << std::endl;
    lua_pushnumber(L, 10);
    return 1;
  }

  __declspec(dllexport) int __cdecl luaopen_myDLL(lua_State* L)
  {
    L = luaL_newstate();
    luaL_openlibs(L);
    std::cout << "[DLL] 正在初始化!" << std::endl;

    lua_register(L, "fun1", function_1);
    luaL_dofile(L, "./run.lua");
    return 1;
  }
}

使用VS编写并构建为dll。

在Lua内运行后

package.loadlib("./myDLL.dll", "luaopen_myDLL")()

require("myDLL")

DLL被加载并像预期一样运行,也运行指定的run.lua来执行function_1。

run.lua里面没有什么特殊的,只是类似这样的东西:

f = function_1()
print("[Lua] 函数1说", f, "\n");

我现在的问题是:

  1. 我无法从初始的Lua脚本调用DLL来运行function_1()。尝试这样做会得到attempt to call global 'function_1' (a nil value)

  2. 我必须在我的C代码内使用L = luaL_newstate();。出于某种原因,它不能与传递的lua_State*一起工作,我认为这就是我无法从加载我的DLL的LUA脚本中调用注册函数的原因。在运行luaL_newstate()之前,我的lua_State具有有效地址,这在新状态之后不会改变。

理论上我可以从我的C库内运行任何Lua脚本来执行注册的函数,但这对我来说似乎更像一个肮脏的解决方案。

我的问题是,我是否缺少什么必要的东西?

附注:我正在使用Lua 5.1

点赞
用户1836540
用户1836540

以下代码应该可以工作。 由于以下原因可能无法正常工作:

  • 使用二进制文件运行最初的Lua脚本(其中包含 require(“myDLL”))的Lua版本不同和/或不使用共享dll。
  • 您在C ++代码中使用的Lua头文件与原始的 lua.exe 具有不同的Lua版本
  • 您将项目链接到不同的Lua版本
  • 您使用解决方案重新编译Lua(如果要使用 lua.exe,则必须仅使用标头和已提供的 .lib 文件与Lua分发)

要使您的代码在Lua中可用,您必须使用适当的Lua版本的Lua头文件,并链接适当的 .lib 文件,并使用使用共享库的lua.exe(我猜是lua.dll)。

static int function_1(lua_State* L)
{
    std::cout << "[DLL]this is a custom function" << std::endl;
    lua_pushnumber(L, 10);
    return 1;
}

extern "C" int __declspec(dllexport) luaopen_quik(lua_State *L) {
    std::cout << "[DLL] being initialized!" << std::endl;
    lua_register(L, "fun1", function_1);
    luaL_dofile(L, "./run.lua");
    return 0;
}

附:请提供您的解决方案文件,以便我可以进一步帮助,因为这不是代码问题 - 而是链接问题。

2016-11-11 19:22:57