GA好望角|魔力宝贝私服|魔力私服|魔力私服|GA反外挂

 找回密码
 立即注册
凤凰(QQ:715837)
售前咨询
GA白皮书(客户端)
GA白皮书(服务端)
cgdev.me开发者论坛
放映地(炫斗魔力公益PK服)
新服发布站
欢迎来到GA好望角~
价格公示表
回首页
关于妖城与某些恶意人士对我们恶意抹黑的回应
查看: 3343|回复: 1

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

[复制链接]

135

主题

142

帖子

142

积分

管理员

Rank: 9Rank: 9Rank: 9

金钱
2297
号角币
474
发表于 2021-4-25 15:41:42 | 显示全部楼层 |阅读模式

有时候我们需要一些权限 调用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")


lualib.zip (13.83 KB, 下载次数: 46)





回复

使用道具 举报

1

主题

191

帖子

191

积分

注册会员

Rank: 2

金钱
104
号角币
0
发表于 2022-3-4 10:48:46 | 显示全部楼层

希望论坛越办越好,会员越来越多,越来越活跃
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|GA好望角

GMT+8, 2024-12-22 10:25 , Processed in 0.090122 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表