[√]lua加载dll

简介: [√]lua加载dll

排查错误

error loading module 'xxx' from file 'xxxx.dll':

lua有自己的入口函数规则lua_open_模块名字,需要匹配,不能随便调整目录结构:

LUASOCKET_API int luaopen_socket_core(lua_State *L) {}
/* prefix for open functions in C libraries */
#define LUA_POF   "luaopen_"
#define POF   LUA_POF
static const char *mkfuncname (lua_State *L, const char *modname) {
  const char *funcname;
  const char *mark = strchr(modname, *LUA_IGMARK);
  if (mark) modname = mark + 1;
  funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);
  funcname = lua_pushfstring(L, POF"%s", funcname);
  lua_remove(L, -2);  /* remove 'gsub' result */
  return funcname;
}

mkfuncname 是一个辅助函数,用于构建在 C 函数库中打开指定模块的函数名。它根据模块名生成 C 函数名,并将其格式化为 "luaopen_模块名" 的形式。在 Lua 调用 require 加载 C 函数库时,会调用这个生成的函数来进行初始化。这个函数使用 Lua 的字符串操作函数 luaL_gsub 将模块名中的 "." 替换为当前系统默认的函数名分隔符(通过 LUA_OFSEP 宏定义),然后调用 lua_pushfstring 将函数名压入 Lua 栈中。最后,通过 lua_remove 移除之前调用 luaL_gsub 生成的结果字符串。

一直报错找不到模块

image.png

原因是我的lua动态库名字不一致导致

image.png

可以看到core.dll依赖的是lua5.1.dll,如果随便将lua模块编译为lua.dll,可能就无法正确加载core.dll

要注意自己编译dll的时候,使用的lua版本,和宿主的lua版本必须一致,一般这种情况发生在分开编译dll和exe时比较容易发生。

lua dll demo

自己写的学习例子,一个最简单的lua dll:

#include <lua.h>           
#include <lauxlib.h>           
#include <stdio.h>
/**
 * 定义在lua中可调用的函数,要遵循规范:返回值必须为int,需传入lua_State
 */
static int test(lua_State *L);
int luaopen_dbg(lua_State *L);
#include "dbg.h"
static int test(lua_State *L)
{
    size_t len = 0;
    int num = luaL_checkinteger(L, 1);
    const char *str = luaL_checklstring(L, 2, &len);
    printf("come from test: num = %d  str = %s  len = %d\n", num, str, len);
    return 0;
}
int luaopen_dbg(lua_State *L)
{
    luaL_Reg l[] =
        {
            {"test", test},
            {NULL, NULL}};
    // luaL_newlib(L, l); // lua504才有这个函数
    luaL_register(L, "dbg", l);
    return 1;
}

定一个了一个dbg模块,在使用时将编译好的dbg.dll放在和lua.5.1.dll同目录,直接require,调用相关的函数即可

local lib = require(libName)
lib:test()

用法

dll的用法有点类似模块化开发,我们可以将不同的功能封装为一个模块,并编译为dll提供给别人使用,如果模块发生了更新,我只需要更新这个模块的dll就行了。

我还见过一种用法,你希望自己的应用软件仅仅是个壳,具体的实现放到了dll中,使用lua脚本调用dll,完成逻辑的执行,这种模式下的软件,其实dll非常有用,做WG的最喜欢这种方式。

在手游开发中,很少使用到这种技术,因为动态库有点水土不服。

目录
相关文章
|
3月前
|
存储 NoSQL 关系型数据库
使用lua脚本操作redis
使用lua脚本操作redis
50 0
|
3月前
|
NoSQL Java Redis
Redis进阶-lua脚本
Redis进阶-lua脚本
62 0
|
1月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
63 0
|
2月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
80 0
|
5天前
|
存储 NoSQL 调度
Redis Lua脚本:原子性的真相揭秘
【4月更文挑战第20天】
20 0
Redis Lua脚本:原子性的真相揭秘
|
24天前
|
NoSQL Java Redis
lua脚本做redis的锁
这段内容是关于使用Redis实现分布式锁的Java代码示例。`RedisLock`类包含`lock`和`unlock`方法,使用`StringRedisTemplate`和Lua脚本进行操作。代码展示了两种加锁方式:一种带有过期时间,另一种不带。还提到了在加锁和解锁过程中的异常处理,并提供了相关参考资料链接。
18 3
|
27天前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
|
1月前
|
监控
通过Lua脚本实现禁止员工上班玩游戏的软件的自动化任务管理
使用Lua脚本,企业可以自动化管理员工行为,防止上班时间玩游戏。Lua是一种轻量级脚本语言,适合编写监控任务。示例脚本展示了如何检测工作时间内员工是否玩游戏,并在发现时执行相应操作,如关闭游戏或发送警告。此外,另一脚本演示了如何将监控数据通过HTTP POST自动提交到网站,以实现有效的行为管理。这种解决方案灵活且可定制,有助于提升工作效率。
132 1
|
1月前
|
NoSQL Java 数据库
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
100 0
|
1月前
|
Java API Maven