lua调用C++写的DLL实现“热更新”
来源:互联网 发布:跟程序员交流用的术语 编辑:程序博客网 时间:2024/05/27 01:07
原创作品,转载请注明来源是CSDN:http://blog.csdn.net/relar/article/details/38084689
开发游戏服务器往往有“热更新”的需求,就是在不停止服务程序的情况下,对服务程序进行升级。这里采用lua脚本桥接C++的模式。程序主框架用C++,程序的业务逻辑也是C++(具体的是C++写的DLL),这两者之间用LUA脚本语言进行桥接。当程序运行时,只要改变LUA脚本,即可以选择使用不同的DLL,以实现业务逻辑的升级更新。
上演示代码,代码分为三部分,第一部分是主程序:
//本例演示了lua调用DLL#include "stdafx.h"#include <stdio.h>#include <string.h>#include <malloc.h>#include <conio.h>#include "include\lua.hpp"int _tmain(int argc, _TCHAR* argv[]){int global_var1 = 0;printf("这个程序演示Lua调用C++的Dll:\n");lua_State *pLuaState = luaL_newstate(); //也可以用lua_open();luaL_openlibs(pLuaState);if (luaL_dofile(pLuaState, "main2.lua"))// 加载脚本文件{printf("dofile error.\n");}_getch();if (luaL_dofile(pLuaState, "main2.lua"))// 第二次加载脚本文件{printf("dofile error.\n");}_getch();lua_close(pLuaState);return 0;}
第二部分是DLL,我的工程名称是Func1,编译出来的自然是Func1.dll
#include "my.h"int GameLogic1(lua_State *L){int n = lua_gettop(L);double sum = 0;int i;for (i = 1; i <= n; i++){sum += lua_tonumber(L, i);}lua_pushnumber(L, sum / n);lua_pushnumber(L, sum);return 2;}const struct luaL_Reg Func1lib[] = {{ "GameLogic1", GameLogic1 },{ NULL, NULL }};int luaopen_Func1lib(lua_State* L){luaL_openlib(L, "Func1lib", Func1lib, 0);return 1;}
其中my.h的代码如下:
#include "include\lua.hpp"#pragma comment(lib, "lua5.1.lib")#if defined(_WIN32)extern "C" _declspec(dllexport) int luaopen_Func1lib(lua_State* L);#elseextern "C" int luaopen_Func1lib(lua_State* L);#endif
注意,上面extern "C"这几句曾让我浪费了不少时间。因为DLL是用C++写的,而LUA是用C写的,所以一定要用extern "C"语句。
下面是LUA脚本:
local testlib = package.loadlib("E://Func1.dll", "luaopen_Func1lib")print(testlib)--, "Can not open testlib.")if(testlib)thentestlib(); --调用DLL中抛出函数a,b=Func1lib.GameLogic1(6,6)print("average:",a,"sum:",b);a,b=Func1lib.GameLogic2(3,6)print("average:",a,"sum:",b);else print("Error")end
这个脚本也让我浪费了很长时间,它有两个陷阱,第一,它一定要写DLL的绝对路径,第二,这个脚本在LUA命令行中无法运行,只有在C++程序中被调用。不注意这两点会让你疯掉。
另外我按照Func1.dll又写一个Func2.dll,内容稍有不同(这里就不必上代码了哈),演示的时候主程序执行了第一次加载脚本后会等待用户输入任意键,此时可以把脚本改为使用Func2.dll,再输入任意键让程序继续运行,业务逻辑就改了。
还有人是把业务逻辑以纯LUA实现,但是LUA自身功能有限,它生来就是用来调用或被C/C++调用的。
0 0
- lua调用C++写的DLL实现“热更新”
- cocos lua 实现热更新
- unity dll实现热更新
- unity dll实现热更新
- 【Lua】Unity中热更新的实现方式
- Lua的系统学习(杂)_通过Lua调用C#方法(热更新最直观的原理理解)_简单的随机数实现
- java调用C/C++写的dll
- java 调用C写的DLL
- Delphi调用C写的dll
- python 调用c写的dll/so
- PB调用C/C++写的dll
- C++结合LUA实现代码热更新
- unity lua热更新之 利用lua的table实现c#的new对象
- java中调用c(c++)写的dll文件的实现及步骤
- java中调用c(c++)写的dll文件的实现及步骤
- java中调用c(c++)写的dll文件的实现及步骤
- java中调用c(c++)写的dll文件的实现及步骤(转)
- java中调用c(c++)写的dll文件的实现及步骤(转)
- hadoop 在win7 下安装 +eclipse 和 cygwin
- hdu-1201-18岁生日
- ibatis实战之基础环境搭建
- Linux系统编程(6)——文件系统
- Android webview加载html5网络视频全屏播放
- lua调用C++写的DLL实现“热更新”
- Suse 创建NFS共享文件夹
- java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
- HDU 1233 还是畅通工程【最小生成树】
- ibatis实战之OR映射
- JQuery插件之jQuery-easing的简单使用
- source insight的查找功能
- 数据结构--串--定长顺序存储表示
- orcl导入导出 exp imp 方式