【问题标题】:Get Lua state from inside Lua so it can be passed back to C从 Lua 内部获取 Lua 状态,以便将其传递回 C
【发布时间】:2011-04-09 05:38:00
【问题描述】:

我能够从 Lua 中加载从 C 源代码创建的 DLL。所以我想要做的就是将当前的 Lua 状态从 Lua 传递给加载的 DLL。

基本上我使用的是使用 Lua 的游戏引擎。所述游戏引擎的场景编辑器创建 Lua 状态并调用 Lua 脚本,我知道它为它调用的所有脚本使用 1 个 lua 状态。所以,我想从这些 lua 脚本本身中可以知道状态。从这些 Lua 脚本中,我想加载我自己的 DLL 并将此状态传递给该 DLL,因此我的 C++ 代码可以使用该 lua 状态从相同的 lua 脚本调用 lua 函数并处于相同状态。那有意义吗?

【问题讨论】:

    标签: c++ dll lua


    【解决方案1】:

    我想我遗漏了一些明显的东西(这不会让我感到惊讶 - 我远非 Lua 专家)。

    但是如果你调用package.loadlib,你取回的函数句柄将会被Lua本身的状态调用,不是吗?见the CFunction prototype

    【讨论】:

    • 这对我来说似乎是正确的 - Lua 调用的 C 函数传递了 Lua 状态。只需像这样定义您的 DLL 函数: int myLuaFunction(lua_State *L) { //L 包含状态 }。抱歉格式化,cmets 似乎没有换行符。
    【解决方案2】:

    将您的 DLL 编写为用 C 实现的普通 Lua 模块。PiL has a description,但它加起来就是在 DLL 的名称之后命名单个导出函数,以便普通的 require 函数可以加载它。要获得require "mylib" 加载的库,您可以使用导出函数luaopen_mylib() 创建mylib.dll,该函数会创建一个包含您希望能够使用的所有方法的表并返回它。该函数以及它创建的所有其他方法,在每次调用时都会传递当前 Lua 状态。

    如果您的引擎不允许在脚本中使用require,那么它也不太可能允许package.loadlib,并且您可能根本无法加载您的DLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2013-07-24
      • 2012-05-27
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2014-08-28
      相关资源
      最近更新 更多