#include "stdafx.h" #include <windows.h> #include <conio.h> #include <ctype.h> #define LUA_FILE "Plus.lua" #include "LuaPlus.h" using namespace LuaPlus; LuaStateOwner g_LusState(true); void CPrint(const char* sMsg) { printf(sMsg); OutputDebugString(sMsg); } int L_CPrint(LuaState* pState) { OutputDebugString("Table Function\r\n"); LuaStack args(pState); int iArgs = args.Count(); const char* sMsg = args[1].GetString(); int iTimes = args[2].GetInteger(); for (int i=0;i<iTimes;i++) { CPrint(sMsg); } return iTimes; } class CLogger { public: CLogger() : m_sVal("Value\r\n"){}; ~CLogger(){}; public: void LogMsg(const char* sMsg) { CPrint(sMsg); CPrint(m_sVal); } static void S_LogMsg(const char* sMsg) { CPrint(sMsg); } void SetVal(const char* sVal) { m_sVal = (char*)sVal; } void SP_LogMsg(const char* sMsg) { OutputDebugString(m_sVal); OutputDebugString(sMsg); } public: char* m_sVal; }; void DoTest() { int iRet = g_LusState->DoFile(LUA_FILE); //获取变量 LuaObject varObj = g_LusState->GetGlobal("Variable"); int iVal = varObj.GetInteger(); LuaObject wstrObj = g_LusState->GetGlobal("WStr"); const lua_WChar* pWS = wstrObj.GetWString(); char ansi[7] = {pWS[0],pWS[1],pWS[2],pWS[3],pWS[4],pWS[5],0}; wchar_t name[10] = {0}; MultiByteToWideChar(CP_ACP,0,ansi,-1,name,10); //添加变量 g_LusState->GetGlobals().SetNumber("TmpVar",123); iVal = g_LusState->GetGlobal("TmpVar").GetInteger(); //使用Lua函数 LuaFunction<int> luaAdd = g_LusState->GetGlobal("LuaAdd"); iVal = luaAdd(2,5); //注册C函数 g_LusState->GetGlobals().RegisterDirect("CPrint",CLogger::S_LogMsg); //Lua函数调用C函数 LuaFunction<void> luaCPrint = g_LusState->GetGlobal("LuaCPrint"); luaCPrint("lua run c function\r\n"); //注册C++类成员函数 CLogger logger; logger.m_sVal = "abcdefg"; g_LusState->GetGlobals().RegisterDirect("LogMsg", logger, &CLogger::LogMsg); g_LusState->GetGlobals().RegisterObjectDirect("SP_LogMsg", (const CLogger*)0, &CLogger::SP_LogMsg); //Lua调用类成员函数 LuaFunction<void> luaClassLog1 = g_LusState->GetGlobal("LuaClassPrint"); luaClassLog1("lua run c++ function---1\r\n"); LuaFunction<void> luaClassLog2 = g_LusState->GetGlobal("SP_LuaClassPrint"); luaClassLog2("lua run c++ function---2\r\n"); //使用Lua的Table LuaObject table = g_LusState->GetGlobals().CreateTable("GameApi"); table.SetInteger("Ref", 1); table.SetString("Day", "2009-11-02"); table.Register("Run",L_CPrint); //Lua 使用Table的函数 LuaFunction<int> luaTbl = g_LusState->GetGlobal("LuaTbl"); iVal = luaTbl("LuaTbl Run...\r\n",2); //获取Table的一项 LuaObject tbl = g_LusState->GetGlobal("GameApi"); const char* sDay = tbl.GetByName("Day").GetString(); //Table遍历 for (LuaTableIterator it( tbl ); it; it.Next() ) { const char* key = it.GetKey().GetString(); LuaObject val = it.GetValue(); if (val.IsNumber()) { printf("Key: %s --- NumberValue: %f\r\n",key,val.GetFloat()); } else if (val.IsString()) { printf("Key: %s --- StringValue: %s\r\n",key,val.GetString()); } else if (val.IsFunction()) { printf("Key: %s --- Function\r\n",key); } else if (val.IsCFunction()) { printf("Key: %s --- CFunction\r\n",key); } } } int _tmain(int argc, _TCHAR* argv[]) { LuaStateOwner state; state->DoString("print('Hello World\\n')"); printf("Begin Test LuaPlus Library......\r\n"); DoTest(); printf("End Test LuaPlus Library......\r\n"); _getch(); return 0; } Plus.lua内容如下: Variable = 12345 WStr = L"LuaPlus测试" print("luaplus do file\r\n") function LuaAdd(x,y) return x + y + TmpVar end function LuaCPrint(sMsg) CPrint(sMsg) end function LuaClassPrint(sMsg) LogMsg(sMsg) end function LuaTbl(sMsg,iTimes) CPrint(GameApi.Day) CPrint(string.format("%d",GameApi.Ref)) GameApi.Run(sMsg,iTimes) end function SP_LuaClassPrint(sMsg) SP_LogMsg(sMsg) end |