在Lua中调用库函数
我已经使用 Lua 在 Wireshark 中创建了一个 TCP 应用程序识别器。我尝试使用 zlib 压缩和 base64 解密。我应该如何在 Lua 中创建或调用现有的 C 库呢?
我看到的文档只是说你可以获取库并使用 require() 调用或 luaopen_ 调用,但没有告诉我如何让程序找到和识别实际的库。所有这些都是在 Windows 上进行的。
如何在 Lua 中创建或调用现有的 C 库?
对于不是为 Lua 编写的任意 C 库,一般不能直接调用。
一个可供 Lua 使用的“模块”必须链接到 Lua API,与宿主解释器版本相同,例如 Wireshark 目录的根目录中的 Lua5.1.dll, 并公开与 lua_CFunction 签名匹配的可从 C 调用的函数。Lua 可以加载库并调用该函数,而该函数负责使用 Lua API 实际暴露功能给 Lua。
你的 zlib 和 / 或 base64 库对 Lua 一无所知。 如果你有一个内置 FFI 的 Lua 解释器,或者你找到了一个可以加载的 FFI Lua 模块,你可能可以让它工作,但这真的不值得一试。编写 Lua 模块实际上非常容易,你可以将接口量身定制为适合 Lua 的习惯用法。
举个例子,我们想让我们的 Lua 脚本使用 Windows 的 user32.dll 库中的 MessageBox 函数,但我没有 zlib 或 base64 C 库。
#include <windows.h>
#include "lauxlib.h"
static int luaMessageBox (lua_State* L) {
const char* message = luaL_checkstring(L,1);
MessageBox(NULL, message, "", MB_OK);
return 0;
}
int __declspec(dllexport) __cdecl luaopen_messagebox (lua_State* L) {
lua_register(L, "msgbox", luaMessageBox);
return 0;
}
要构建它,我们需要链接到 user32.dll(包含 MessageBox)和 lua5.1.dll(包含 Lua API)。您可以从 Wireshark 源中获得 Lua5.1.lib。这里是使用 Microsoft 的编译器生成 messagebox.dll:
cl /LD /Ilua-5.1.4/src messagebox.c user32.lib lua5.1.lib
现在你的 Lua 脚本可以这样写:
require "messagebox"
msgbox("Hello, World!")
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你不能用纯 Lua 来加载任何未为 Lua 创建的现有 C 库。至少不是一件简单的事情。
*.so/*.dll必须遵循某些特定的标准,这些标准在 编程 Lua#26.2 和 lua-users wiki,代码示例 中被简单提到。也有类似问题的解答在 这里。有两种方法可以解决您的问题:
zlib库包装器。更多列表请参见 @lua-users wiki
同样适用于
base64编码/解码。唯一不同的是,已经有纯 Lua 库了。该 @lua-users wiki 上提供了代码示例和几个链接。注意: Lua 模块包管理器例如 LuaRocks 或 LuaDist 可能可以节省您大量时间。
另外,简单加载 Lua 模块通常只包括一行:
local zlib = require("zlib")该模块将在定义在您的 Lua 解释器的 luaconf.h 文件中的位置中搜索。
对于 5.1,它是:
#if defined(_WIN32) /* ** In Windows, any exclamation mark ('!') in the path is replaced by the ** path of the directory of the executable file of the current process. */ #define LUA_LDIR "!\\lua\\" #define LUA_CDIR "!\\" #define LUA_PATH_DEFAULT \ ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" #define LUA_CPATH_DEFAULT \ ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" #else