C++ 是否可以调用任何主机c/c++;按函数地址从lua脚本中提取函数?

C++ 是否可以调用任何主机c/c++;按函数地址从lua脚本中提取函数?,c++,c,lua,language-interoperability,C++,C,Lua,Language Interoperability,我已经编译了用c/c++编写的控制台主机程序(我没有源代码)。主机程序支持lua脚本(可能使用lua虚拟机)。主机程序加载lua库 卢奥彭乌基地 卢奥彭欧桌 卢奥潘乌串 卢奥彭大学数学系 luaopen_调试 并允许重新加载所有lua脚本 是否可以通过函数地址(从宿主程序中的外部调试器获得)从lua脚本调用任何宿主c/c++函数 在这种情况下,是否可以从lua加载任何C/C++编译的lib并调用其函数 另一个论坛上的一个人写了这个问题的代码 // re = callClientFunction(

我已经编译了用c/c++编写的控制台主机程序(我没有源代码)。主机程序支持lua脚本(可能使用lua虚拟机)。主机程序加载lua库

卢奥彭乌基地 卢奥彭欧桌 卢奥潘乌串 卢奥彭大学数学系 luaopen_调试

并允许重新加载所有lua脚本

是否可以通过函数地址(从宿主程序中的外部调试器获得)从lua脚本调用任何宿主c/c++函数

在这种情况下,是否可以从lua加载任何C/C++编译的lib并调用其函数

另一个论坛上的一个人写了这个问题的代码

// re = callClientFunction(addr, { args }, 'cdecl')
// re = callClientFunction(method, { obj, arg1 }, 'this')
// re = callClientFunction(0x08, { obj, arg1 }, 'this')   = obj->vtable[2]->(arg1)

inline int callCdeclFunction(lua::State* L, uintptr_t addr, const std::vector<lua::Integer>& args)
{
typedef lua::Integer __cdecl cf0();
typedef lua::Integer __cdecl cf1(lua::Integer);
typedef lua::Integer __cdecl cf2(lua::Integer, lua::Integer);
typedef lua::Integer __cdecl cf3(lua::Integer, lua::Integer, lua::Integer);
typedef lua::Integer __cdecl cf4(lua::Integer, lua::Integer, lua::Integer, lua::Integer);
typedef lua::Integer __cdecl cf5(lua::Integer, lua::Integer, lua::Integer, lua::Integer, lua::Integer);

lua::Integer re = 0;
switch(args.size())
{
case 0: re = reinterpret_cast<cf0*>(addr)(); break;
case 1: re = reinterpret_cast<cf1*>(addr)(args[0]); break;
case 2: re = reinterpret_cast<cf2*>(addr)(args[0], args[1]); break;
case 3: re = reinterpret_cast<cf3*>(addr)(args[0], args[1], args[2]); break;
case 4: re = reinterpret_cast<cf4*>(addr)(args[0], args[1], args[2], args[3]); break;
case 5: re = reinterpret_cast<cf5*>(addr)(args[0], args[1], args[2], args[3], args[4]); break;
default:
  luaL_error(L, "%s: too many args (max %d, provided %d).\n", __func__, 5, args.size());
}  
return re;
}
//re=callClientFunction(addr,{args},'cdecl')
//re=callClientFunction(方法,{obj,arg1},'this')
//re=callClientFunction(0x08,{obj,arg1},'this')=obj->vtable[2]->(arg1)
内联int callcdecl函数(lua::State*L、uintpttr\u t addr、const std::vector和args)
{
typedef lua::Integer _cdecl cf0();
typedef lua::Integer uu cdecl cf1(lua::Integer);
typedef lua::Integer uu cdecl cf2(lua::Integer,lua::Integer);
typedef lua::Integer uu cdecl cf3(lua::Integer,lua::Integer,lua::Integer);
typedef lua::Integer uu cdecl cf4(lua::Integer,lua::Integer,lua::Integer,lua::Integer);
typedef lua::Integer uu cdecl cf5(lua::Integer,lua::Integer,lua::Integer,lua::Integer,lua::Integer);
lua::整数re=0;
开关(args.size())
{
案例0:re=重新解释铸件(addr)();断裂;
案例1:re=重新解释铸造(addr)(参数[0]);断裂;
案例2:re=重新解释(addr)(参数[0],参数[1]);中断;
案例3:re=重新解释(addr)(参数[0],参数[1],参数[2]);中断;
案例4:re=reinterpret_cast(addr)(args[0],args[1],args[2],args[3]);break;
案例5:re=reinterpret_cast(addr)(args[0],args[1],args[2],args[3],args[4]);break;
违约:
luaL_错误(L,“%s:参数太多(最多%d,提供了%d)。\n”,_函数,5,args.size());
}  
返回re;
}

您知道如何在编译的主机程序中使用它吗?

要访问Lua中的C/C++函数,您必须通过特定的api公开这些函数,Lua不会直接加载“常规”DLL(或者,如果您需要的话)。相反,您必须有一个中间库来向Lua环境公开哪些C函数可用


干杯

要访问Lua中的C/C++函数,您必须通过特定的api公开它们,Lua不会直接加载“常规”DLL(或者。因此,如果您需要的话)。相反,您必须有一个中间库来向Lua环境公开哪些C函数可用


Cheers

从Lua调用C/C++函数的正确方法是编写接口代码以交换Lua堆栈上的数据

但是,有一些扩展允许直接调用共享库(.dll或.so)中的函数

看看外国金融机构图书馆()
或者使用libffi库()的Alien Lua()

从Lua调用C/C++函数的正确方法是编写接口代码来交换Lua堆栈上的数据

但是,有一些扩展允许直接调用共享库(.dll或.so)中的函数

看看外国金融机构图书馆()
或者使用libffi库()的Alien Lua()

宿主程序是动态加载Lua还是静态链接到Lua中?在第一种情况下,您可能会编写自己的“Lua”库并愚弄主机。主机程序是动态加载Lua还是静态链接到Lua中?在第一种情况下,您可能编写自己的“Lua”库并愚弄主机;这是LuaJIT的特色,“FFI图书馆”不是图书馆;这是LuaJIT的特色。