使用Lua 5.1自定义DLL
2020-6-20 9:12:55
收藏:0
阅读:121
评论:1
我正在尝试从Lua内部使用自定义DLL。我有一个简单的DLL,例如:
extern "C"
{
static int function_1(lua_State* L)
{
std::cout << "[DLL]这是一个自定义函数" << std::endl;
lua_pushnumber(L, 10);
return 1;
}
__declspec(dllexport) int __cdecl luaopen_myDLL(lua_State* L)
{
L = luaL_newstate();
luaL_openlibs(L);
std::cout << "[DLL] 正在初始化!" << std::endl;
lua_register(L, "fun1", function_1);
luaL_dofile(L, "./run.lua");
return 1;
}
}
使用VS编写并构建为dll。
在Lua内运行后
package.loadlib("./myDLL.dll", "luaopen_myDLL")()
或
require("myDLL")
DLL被加载并像预期一样运行,也运行指定的run.lua来执行function_1。
run.lua里面没有什么特殊的,只是类似这样的东西:
f = function_1()
print("[Lua] 函数1说", f, "\n");
我现在的问题是:
我无法从初始的Lua脚本调用DLL来运行function_1()。尝试这样做会得到
attempt to call global 'function_1' (a nil value)我必须在我的C代码内使用
L = luaL_newstate();。出于某种原因,它不能与传递的lua_State*一起工作,我认为这就是我无法从加载我的DLL的LUA脚本中调用注册函数的原因。在运行luaL_newstate()之前,我的lua_State具有有效地址,这在新状态之后不会改变。
理论上我可以从我的C库内运行任何Lua脚本来执行注册的函数,但这对我来说似乎更像一个肮脏的解决方案。
我的问题是,我是否缺少什么必要的东西?
附注:我正在使用Lua 5.1
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

以下代码应该可以工作。 由于以下原因可能无法正常工作:
require(“myDLL”))的Lua版本不同和/或不使用共享dll。lua.exe具有不同的Lua版本lua.exe,则必须仅使用标头和已提供的 .lib 文件与Lua分发)要使您的代码在Lua中可用,您必须使用适当的Lua版本的Lua头文件,并链接适当的 .lib 文件,并使用使用共享库的lua.exe(我猜是lua.dll)。
static int function_1(lua_State* L) { std::cout << "[DLL]this is a custom function" << std::endl; lua_pushnumber(L, 10); return 1; } extern "C" int __declspec(dllexport) luaopen_quik(lua_State *L) { std::cout << "[DLL] being initialized!" << std::endl; lua_register(L, "fun1", function_1); luaL_dofile(L, "./run.lua"); return 0; }附:请提供您的解决方案文件,以便我可以进一步帮助,因为这不是代码问题 - 而是链接问题。