在Lua调用库
我已经在Lua中为TCP上的应用程序创建了Wireshark解析器。我正在尝试使用zlib压缩和base64解密。如何在Lua中创建或调用现有的c库 我看到的文档只是说,您可以获取库并使用在Lua调用库,lua,Lua,我已经在Lua中为TCP上的应用程序创建了Wireshark解析器。我正在尝试使用zlib压缩和base64解密。如何在Lua中创建或调用现有的c库 我看到的文档只是说,您可以获取库并使用require()调用或luaopen\uu调用,但不能真正让程序找到并识别实际的库。所有这些都是在Windows中完成的。您不能加载任何现有的C库,它不是为Lua创建的,而是使用普通Lua。至少这不是小事 #include <windows.h> #include "lauxlib.h" sta
require()
调用或luaopen\uu
调用,但不能真正让程序找到并识别实际的库。所有这些都是在Windows中完成的。您不能加载任何现有的C库,它不是为Lua创建的,而是使用普通Lua。至少这不是小事
#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;
}
*.so/*.dll
必须遵循一些特定的标准,这在和中被直截了当地提到。同样的问题也得到了回答
有两种方法可以解决您的问题:
zlib
库包装器base64
编码/解码。唯一不同的是,已经有了用于此的普通Lua库。代码示例和几个链接
注意:Lua模块包管理器喜欢或
可能会为您节省大量时间
此外,简单地加载Lua模块通常由一行组成:
local zlib = require("zlib")
将在Lua解释器文件中定义的位置搜索模块
对于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
如何在Lua中创建或调用现有的c库
不是为Lua使用而编写的任意库?你通常不能
Lua可消费的“模块”必须与Lua API(与主机解释器的版本相同,如Wireshark目录根目录中的Lua5.1.dll)链接,并公开与签名匹配的C可调用函数。Lua可以加载库并调用该函数,由该函数使用LuaAPI向Lua公开功能
您的zlib和/或base64库对Lua一无所知。如果您有一个带有内置FFI的Lua解释器,或者您找到了一个可以加载的FFI Lua模块,您可能可以让它工作,但这确实比它的价值更麻烦。编写一个Lua模块实际上非常简单,您可以定制接口,使其更适合Lua
我手头没有zlib或base64 C库,因此举个例子,我们想让Lua脚本使用Windows中user32.dll
库中的MessageBox
函数
#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;
}
现在,您的Lua脚本可以编写:
require "messagebox"
msgbox("Hello, World!")
您唯一的选择是使用类似的库。有关其他FFI库,请参见我的答案 有关Lua中的base64解密,请参阅。