Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Lua调用库_Lua - Fatal编程技术网

在Lua调用库

在Lua调用库,lua,Lua,我已经在Lua中为TCP上的应用程序创建了Wireshark解析器。我正在尝试使用zlib压缩和base64解密。如何在Lua中创建或调用现有的c库 我看到的文档只是说,您可以获取库并使用require()调用或luaopen\uu调用,但不能真正让程序找到并识别实际的库。所有这些都是在Windows中完成的。您不能加载任何现有的C库,它不是为Lua创建的,而是使用普通Lua。至少这不是小事 #include <windows.h> #include "lauxlib.h" sta

我已经在Lua中为TCP上的应用程序创建了Wireshark解析器。我正在尝试使用zlib压缩和base64解密。如何在Lua中创建或调用现有的c库

我看到的文档只是说,您可以获取库并使用
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
必须遵循一些特定的标准,这在和中被直截了当地提到。同样的问题也得到了回答

有两种方法可以解决您的问题:

  • 按照这些标准编写自己的Lua
    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解密,请参阅。