设为首页 加入收藏

TOP

lua调用C++写的DLL实现“热更新”
2015-07-20 18:04:02 来源: 作者: 【 】 浏览:2
Tags:lua 调用 DLL 实现 更新

?

开发游戏服务器往往有“热更新”的需求,就是在不停止服务程序的情况下,对服务程序进行升级。这里采用lua脚本桥接C++的模式。程序主框架用C++,程序的业务逻辑也是C++(具体的是C++写的DLL),这两者之间用LUA脚本语言进行桥接。当程序运行时,只要改变LUA脚本,即可以选择使用不同的DLL,以实现业务逻辑的升级更新。

上演示代码,代码分为三部分,第一部分是主程序:

?

//本例演示了lua调用DLL

#include stdafx.h
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include includelua.hpp int _tmain(int argc, _TCHAR* argv[]) { int global_var1 = 0; printf(这个程序演示Lua调用C++的Dll: ); lua_State *pLuaState = luaL_newstate(); //也可以用lua_open(); luaL_openlibs(pLuaState); if (luaL_dofile(pLuaState, main2.lua))// 加载脚本文件 { printf(dofile error. ); } _getch(); if (luaL_dofile(pLuaState, main2.lua))// 第二次加载脚本文件 { printf(dofile error. ); } _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 includelua.hpp

#pragma comment(lib, lua5.1.lib)

#if defined(_WIN32)
extern C _declspec(dllexport)  int luaopen_Func1lib(lua_State* L);

#else
extern 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)then
	testlib();  --调用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++调用的。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uva10954 - Add All(multiset函数) 下一篇模板方法模式和Effective C++学习..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: