从 Lua 调用活动程序中的 C++ 函数

2023-12-01

我不确定我的问题是否有意义,但我当然知道从谷歌获得结果几乎是不可能的。首先,我做什么not想。我不想调用一些打印“hello world”或将两个数字相加的函数,我想从 C++ 程序加载 Lua 脚本,但允许脚本使用函数修改 C++ 程序的变量。例如,假设我有一个这样的 C++ 程序:

class Foo
{
    private:
        int number = 0;

    public:
        void setNumber(const int& newNumber) {number = newNumber;}
}

int main()
{
    Foo foo;

    //Load and execute Lua script, with foo object

    return 0;
}

我怎样才能让Lua脚本做foo.setNumber()(最好没有foo.)?这可能是一个很简单的问题,但是正如上面提到的,Google 上几乎所有的信息当搜索“从 Lua 调用 C++ 函数”时假设没有程序,只有一个 .cpp/hpp 文件,其中包含您要调用的一些函数。

我使用的是 Linux (Ubuntu),但该程序需要在所有平台(Windows 和 Mac)上编译


这里经常有人问这个问题。

要滚动您自己的绑定,您应该:

  1. 完全掌握 Lua 元表。
  2. 阅读Lua 编程有关 C API 的内容,特别是有关类的部分。或者,您可以阅读手册、阅读源代码(尤其是 API 标头)并进行一些谷歌搜索,但这本书可能会节省您一些时间。

概括地说,您可以通过创建包含指向类实例的指针的 Lua“用户数据”并将其传递给 Lua 脚本来向 Lua 公开 C++ 类实例。 userdata 是一种不透明类型; Lua 脚本实际上不能用它做任何事情(除了传递它),除非你给它一个元表。至少你必须实施__index用户数据上的元方法,它允许您的 C++ 代码拦截对用户数据进行索引的尝试并返回有意义的内容,并且__gc元方法,它允许您的 C++ 代码在相应的 Lua 用户数据被垃圾收集时删除公开的 C++ 对象。

例如,您创建一个名为的函数createFoo这创建了一个Foo实例,将指针包装为用户数据,应用元表实现__index并将其返回给 Lua 脚本。

当用户运行时foo.setNumber,你的C++__index使用用户数据和字符串“setNumber”调用元方法。返回什么由您决定,这决定了什么foo.setNumber在 Lua 脚本中求值为 。你要foo.setNumber评估为lua_CFunction它期望一个Foouserdata 作为它的第一个参数,这样你的类方法就可以从 Lua 中惯用地调用(即foo:setNumber(12),这是语法糖foo.setNumber(foo, 12)).

这是一个非常低级别的手动过程,一旦您掌握了它,您最终将创建一个库/模板/宏来为您做样板。那时您可能想要评估无数C++ 绑定库存在的。然而,感谢抽象泄漏定律首先学习手动执行此操作是一个非常好的主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Lua 调用活动程序中的 C++ 函数 的相关文章

  • 无捕获 lambda 是结构类型吗?

    P1907R1 http www open std org jtc1 sc22 wg21 docs papers 2019 p1907r1 html 接受 C 20 引入结构类型 它们是非类型模板参数的有效类型 GCC 和 Clang 都接
  • TPL Dataflow如何删除块之间的链接

    我想知道 如何删除块之间的链接 换句话说 我想要与 LinkTo 相反 我想写一个基于 tlp 数据流的记录器 我编写了这个接口 并希望在需要时删除 ILogListener 的订阅 public interface ILogManager
  • 使用 C# 使用证书进行 SSL 客户端身份验证

    我需要创建一个 C 应用程序 该应用程序必须使用 SSL 向服务器发送 API 请求 我需要创建客户端身份验证 我已经拥有服务器 CA 证书 客户端证书 cer 客户端私钥 pem 和密码 我找不到有关如何创建客户端连接的示例 有人可以建议
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 如何使用 Lua 运行可执行文件?

    我有一个可执行文件想要使用 Lua 运行 我该怎么做 似乎无法在任何地方找到有关此的任何文档 您可以使用 Lua 原生的 执行 命令 Example os execute c temp program exe 资料来源 Lua 指南 os
  • 如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

    TL DR 如何将 JSON 字符串发送到带有 auth 标头的 REST 主机 我尝试了 3 种不同的方法 发现一种适用于匿名类型 为什么我不能使用匿名类型 我需要设置一个名为 Group Name 的变量 并且连字符不是有效的 C 标识
  • 如何在 VS 2013 的立即窗口中执行 LINQ 和/或 foreach?

    在调试过程中探测当前状态时 立即窗口是非常有用的工具 我了解到 通过使用问号 人们可以在那里做更多的事情 如图所示在这篇文章中 https stackoverflow com questions 32934635 execute metho
  • 未构建 csproj 时抑制 AfterBuild 目标

    我在 MSBuild 中有一个构建后目标来复制一些构建输出 这是 linkedin 作为对AfterBuild目标 暴露于Microsoft CSharp targets
  • 将二维整数作为 Readonly/const 存储在单独的类中,同时保持非公开

    这是我在使用这个地方作为我的 去处 以获取关于什么有效 无效 为什么等的一般意见之后的第一个问题 那么让我们试试这个 由于我的经验有限 我一直在尝试寻找更好的方法来创建固定数据字段 我可以在整个程序中引用这些字段 例如我反复显示的最终用户可
  • 隐藏树视图列表中的节点。在 C# 中

    我正在使用 VS 2005 C 正在处理一个未完成的 WinForm 我已将 XML 解析为树视图列表 但遇到了一些问题 我想知道是否有一种方法可以隐藏 过滤 删除名称中包含 this text 的某个节点 而不必依赖文本框 这就是我对这个
  • 如何设置环境名称(IHostingEnvironment.EnvironmentName)?

    默认 ASP NET Core Web 项目包含以下行Startup cs if string Equals env EnvironmentName Development StringComparison OrdinalIgnoreCas
  • GridView必须添加到表单标签中才能渲染

    TextWriter tr new StringWriter HtmlTextWriter writer new HtmlTextWriter tr HtmlForm form new HtmlForm form Controls Add
  • 在 C++ 泛型编程中处理 void 赋值

    我有 C 代码 它包装任意 lambda 并返回 lambda 的结果 template
  • 从多页 tiff 中提取帧 - C#

    有一个多页 tiff 我想从此 Tiff 文件中提取第 n 页 帧 n 并保存它 如果我的多页 tiff 有 3 帧 在我提取一页 帧后 我想留下 1 张图像有 2 页 帧 并且 1 张图像只有 1 页 帧 下面是一些代码 用于将多帧 ti
  • NHibernate Criteria API 是否支持集合属性的投影?

    我需要使用条件 API 复制以下工作 HQL 查询 session CreateQuery select c from Parent p inner join p Children c where p Id 9 and c Id 33 Se
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 写入 Windows 7“预览”窗口区域

    如何使用 C 将控件写入或绘制到 Windows 7 预览区域 作为我正在讨论的示例 请在 Windows 7 中打开 Windows Media Player 并播放一首歌曲 播放歌曲时 最小化 Windows Media Player
  • Fluent Validation 将 CustomAsync 更改为 MustAsync

    有人可以帮我解决这个问题吗 我正在努力改变CustomAsync 到 MustAsync 但我无法让事情发挥作用 下面是我的自定义方法 RuleFor o gt o MustAsync o gt return CheckIdNumberAl
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上

随机推荐

  • if 语句中的 getline

    从我读到的来看 getline 在布尔上下文中使用会返回隐式转换为void 我在网络上没有找到任何真正引用此声明的地方 它到处都说隐式转换不存在 并且在布尔上下文中指针应该是相同类型的 并且如果ptr 0 than 0转换为指针类型ptr
  • 检查嵌套字典内的成员资格

    这是此问题的后续问题 Python DictReader 跳过缺少列的行 事实证明我很愚蠢 并且使用了错误的 ID 字段 顺便说一句 我在这里使用的是 Python 3 x 我有一个员工字典 由字符串 directory id 索引 每个值
  • 获取Xamarin图库图像的路径?

    我正在尝试获取图库图像的路径 我正在获取存储在内部存储中但不是外部存储中的图像的路径 我还启用了已授予的读写存储和相机访问权限 这是我的代码 void ChoosePhoto try var imageIntent new Intent i
  • PHP 不区分大小写的 in_array 函数

    使用时是否可以进行不区分大小写的比较in array功能 因此 使用这样的源数组 a array one two three four 以下查找都将返回 true in array one a in array two a in array
  • NHaml 可以用作通用模板引擎吗? (MVC 之外)

    我见过很多人喜欢在 ASP NET MVC 中使用 NHaml 视图引擎 但我想知道 NHaml 是否可以用作 NET 中的通用模板引擎 我想在 ASP MVC 视图引擎环境之外从控制台应用程序使用 NHaml 或者生成 HTML 电子邮件
  • VS2012 - 服务器/数据库资源管理器中未显示“创建表”或“显示表数据”菜单选项[重复]

    这个问题在这里已经有答案了 可能的重复 让 Sql Server Data Tools 与 Visual Studio 2012 Express 候选版一起使用 我已经安装了 VS 2012 for Web 和 SQL Server 201
  • 正则表达式:匹配除特定模式之外的所有内容

    我需要一个能够匹配所有内容的正则表达式but以特定模式开头的字符串 具体而言index php以及接下来的内容 例如index php id 2342343 正则表达式 匹配所有内容but a string starting with a
  • laravel Eloquent ORM 多表插入

    我如何使用 laravel Eloquent ORM 关系发出单个请求来插入多个表 表1 用户 id name email 表 2 职位 id user id content 表 3 图像 id user id post id 图片名称 关
  • 在 powershell 中复制文件同时保留文件夹结构的正确方法是什么?

    我似乎永远无法把这件事做好 我有一个现有的文件夹c MyApps Websites MySite已经有一个正在运行的现有网站 我已经下载了位于以下的最新版本c temp MySite artifacts 当我尝试运行这个时 source c
  • 一个人的补足是一个现实世界的问题,还是一个历史问题?

    另一个问题询问如何确定 C 中的奇数 偶数 并且惯用的 x 1 方法被正确标记为损坏基于补语的C 标准允许的系统 系统真的存在于计算机博物馆之外的 现实世界 中吗 我从 20 世纪 70 年代就开始编码 而且我很确定我从未遇到过这样的野兽
  • 接到来电时如何调用活动。

    大家好 我想在默认来电活动上调用我自己的活动 我已经使用广播接收器完成了此操作 我在接到来电时调用我的活动 但当我第二次接到来电时 它第一次工作正常 然后默认来电活动将超过我的活动 我不知道问题是什么 有人可以帮助我吗 显现
  • 动态改变Android Listview的高度

    我的 XML 文件的格式如下 LinearLayout ScrollView RelativeLayout LinearLayout
  • navigator.share(Web Share api)共享React App文本,而不是我放置的文本

    我正在使用 React 不是 React Native 并且尝试使用 Web Share Api 通过我的应用程序共享一些文本和 url 但是 当我打开任何要共享的应用程序时 它会从我放置的文本更改为 React 本地开发的默认文本 是的
  • 无法在 Firefox WebDriver 上获取控制台日志

    我使用的是 Firefox 版本 53 Geckodriver 版本 0 16 selenium 版本 3 4 我想获取 webdriver 的控制台日志 from selenium import webdriver from seleni
  • iPhone 音频会话属性

    我正在开发一个应用程序 它应该具有以下有关音频的属性 可以同时录制和播放声音 可以将音频输出与其他应用程序混合 例如iPod 未插入耳机时扬声器音频输出 插入耳机时音频输出 我使用了以下代码 AVAudioSession audioSess
  • 将所有 Excel 加载项模块导出到 .bas 文件的最快方法是什么?

    我正在开发一个包含许多模块的大型 Excel 插件 我需要将它们导出到 bas 文件以使用 SVN 管理它们 我知道快速导出它们的热键 Ctrl E 但我的模块数量太多 我仍然浪费了太多时间来导出它们 有谁知道更快的方法来做到这一点 这是一
  • 从内存流复制时显示 Windows 文件复制对话框?

    我的应用程序将从 MemoryStream 将文件写入磁盘 我不想创建自己的进度对话框 而是喜欢使用现有的 Windows 功能 例如SHFileOperation Win32 API 显示带有动画和进度条的标准文件复制对话框 但是 此特定
  • Codeigniter:无法访问样式表

    我的 Codeigniter 文件夹的目录结构如下 你可以看到我已经把我所有的资产都放到了assets应用程序根目录下的文件夹 基本 URL 定义为 config base url http kamran dev Codeigniter a
  • 如何使用 Knit 将 .Rmd 文件中的每个块提取到多个 .R 文件

    我们可以将 Rmd 文件 purl 为 R 文件 但是如何将 Rmd 文件中的每个块 purl 为单独的由块标签命名的 R 文件 假设您有以下名为 test Rmd 的 Rmd 文档 This is a test r chunk1 1 4
  • 从 Lua 调用活动程序中的 C++ 函数

    我不确定我的问题是否有意义 但我当然知道从谷歌获得结果几乎是不可能的 首先 我做什么not想 我不想调用一些打印 hello world 或将两个数字相加的函数 我想从 C 程序加载 Lua 脚本 但允许脚本使用函数修改 C 程序的变量 例