如何从最新的lua 5.3调用c dll

时间:2017-04-11 05:15:16

标签: c dll lua wireshark-dissector

更新:问题已解决。 dll不能静态链接到lua,否则会因检测到 多个Lua VM 异常而崩溃。代码打击实际上工作正常,只是留在这里以防万一有人也遇到这个问题。

Wirehark使用lua5.2,因为那里有" lua52.dll"在它的文件夹中。

我正在编写wireshark插件,C语言中的某些算法难以在Lua中实现,所以我尝试通过dll使用这些算法。

大多数在线示例都使用旧版本的Lua,它在dll代码中使用luaL_registerluaL_register在新版本中被lua_newtable / luaL_setfuncs取代,但我在网上找不到任何有效的工作示例。

这是我尝试的内容:

#include <stdio.h>
#include <string.h>
#include "lua.hpp"

#include <windows.h>

extern "C" {
    static int add(lua_State* L)
    {
        MessageBox(0, "", "", 0);
        double op1 = luaL_checknumber(L,1);
        double op2 = luaL_checknumber(L,2);
        lua_pushnumber(L,op1 + op2);
        return 1;
    }

    static luaL_Reg mylibs[] = { 
        {"add", add},
        {0, 0} 
    }; 
    __declspec(dllexport)
    int luaopen_mylib(lua_State* L) 
    {
        lua_newtable(L);
        luaL_setfuncs(L, mylibs, 0);
        lua_setglobal(L, "mylib");

        return 1;
    }
}

和lua代码:

require "mylib" -- <----------crashes
-- local mylib = package.loadlib("mylib.dll","luaopen_mylib");  

print (mylib) 
if(mylib)then
    --mylib();
else
    -- Error
end

local b=mylib.add(11,33);
print("sum:", b);

lua代码在第一行崩溃。如何解决?

另一个问题,如何验证哪个版本的Lua是wireshark使用的?在wireshark的lua控制台中调用print(_VERSION),它什么都没有显示。

1 个答案:

答案 0 :(得分:0)

当静态链接到lua.lib时发生崩溃,我猜lua.lib中已经有一个lua VM,所以使用动态链接,问题就消失了。