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