#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
#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