admin 发表于 2021-4-25 15:41:42

在客户端lua中引用C/C++编译的dll


有时候我们需要一些权限 调用win32的api来实现一些特殊的功能
这个时候lua中没有相关接口 无法满足需求时
GA提供lua原版调用dll接口的方式 理论上支持所有语言编译出来的32位dll

以下是使用C语言编译出来的一个dll源代码例子

#include <Windows.h>

extern "C"{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>
}

static int mysin (lua_State *L)
{
    double d = luaL_checknumber(L, 1);
    lua_pushnumber(L, sin(d));
    return 1;
}

static int l_printf(lua_State *L)
{
    const char * pPattern = luaL_checkstring(L, 1);
    const char * str = luaL_checkstring(L, 2);
    lua_pushnumber(L, printf(pPattern, str));
    return 1;
}

static int l_MessageBox(lua_State *L)
{
    const char * sTitle = luaL_checkstring(L, 1);
    const char * sText = luaL_optstring(L, 2, "");
    MessageBox(NULL, sTitle, sText, 0);
    return 1;
}

static const struct luaL_Reg mylib[] =
{
    {"mysin", mysin},
    {"printf", l_printf},
    {"messagebox", l_MessageBox},
    {NULL, NULL}
};

extern "C" int __declspec(dllexport) luaopen_mylib(lua_State *L)
{
    luaL_newlib(L, mylib);
    return 1;
}


注意事项:
1 以下3个sdk头文件请从本贴中下载 引用到你的项目
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
2 建议使用vc6.0编译dll 以便于您的dll可以支援最低到windows xp版本 如使用vs2008以上版本编译出来的dll 请安装xp sdk 否则您编译出来的dll可能无法在旧系统上直接奔跑 请编译为X86 dll
3 导出函数luaopen_mylib 必须与dll同名 即必须叫做 mylib.dll(大小写敏感)
4 理论上支持任何语言编译出来的dll(包括易语言) 使用易语言编译时 请自行检查线程安全
5 由于dll为本地代码 没有GA提供的lua安全沙箱支持 所以请自行保证(不局限以下)

[*]内存安全(堆内存记得释放)
[*]线程安全(多线程中请使用许可证)
[*]空指针 野指针 数组溢出等


6 本功能不适合没有一定编程基础的用户使用并不对本地代码安全提供查BUG等服务
7 使用本功能制作损害玩家的功能(如病毒木马 矿机等) 接到玩家举报后有权停止本服务


编译出dll后使用方法:
将dll放置跟客户端同目录(可以自行压缩进登录器或者别的方式下载) 并尝试使用以下代码加载
lua 与 C 相互调用例子 https://www.cnblogs.com/qianlicao/p/10794984.html



mylib = require("mylib")
mylib.printf("Say: %s\n", "hello world")
msgbox = mylib.messagebox
msgbox("hello from luaopen_mylib")







yangxudou 发表于 2022-3-4 10:48:46


希望论坛越办越好,会员越来越多,越来越活跃
页: [1]
查看完整版本: 在客户端lua中引用C/C++编译的dll