Files
mir_server/sdk/srvlib/include/CustomLuaScript.h

119 lines
4.6 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/*****************************************************************
LUA脚本对象基础类
showError函数以便决定如何处
*****************************************************************/
#include "BufferAllocator.h"
class CDataPacket;
class CCustomLuaScript
{
protected:
lua_State *m_pLua; //LUA虚拟机对象
int m_nLastError; //上一个错误号
RefString m_sLastErrDesc; //上一个错误的描述
CHAR m_sLastFnName[128]; //上一次调用的函数名称
protected:
//创建虚拟机对象
virtual lua_State* createLuaVM();
//打开基础库。默认会打开base、string、math以及table库。返回true表示成功。
virtual bool openBaseLibs();
//注册本地函数库。返回true表示成功。
virtual bool registLocalLibs();
//调用脚本的初始化函数。函数返回true表示没有错误发生。本类未提供调用初始化函数的实际功能。
virtual bool callInit();
//调用脚本的卸载函数。函数返回true表示没有错误发生。本类未提供调用卸载函数的实际功能。
virtual bool callFinal();
//显示脚本错误内容
virtual void showError(LPCTSTR sError);
protected:
//设置当前调用函数名称,记录调用函数名称的目的是为了输出更详细的错误
inline void setFnName(LPCSTR sName){ _asncpytA(m_sLastFnName, sName); }
//格式化错误内容并显示格式化后错误内容字符串的长度被限制为1024个字符。
void showErrorFormat(LPCTSTR sFmt, ...);
/* 脚本调用函数
lua_pcall的行为以便集中错误处理
true表示没有错误
*/
bool pcall(const int args, const int results, const int nErrFunc);
//检查脚本调用返回值如果nError不为成功值则会输出错误内容并返回false且nError的值被保存在m_nLastError中。
inline bool lcCheck(int nError);
/*
* Comments:
* Param lua_State * L:
* Param const char * szContent: lua脚本内容
* Param CDataPacket & packet:
* @Return bool:truefalse
* @Remark:
*/
bool CompileLua(lua_State* L, const char* szContent, CDataPacket &packet);
/*
* Comments: Writer
* Param lua_State * L: Lua状态机
* Param const void * p:
* Param size_t size:
* Param void * u: userData CDataPacket*
* @Return int: 00
* @Remark:
*/
static int StreamWriter(lua_State* L, const void* p, size_t size, void* u);
public:
CCustomLuaScript();
virtual ~CCustomLuaScript();
/* 设置脚本内容,会完成如下核心操作:
1
2
3
4
5
6
sText为NULL或为空字符串则会销毁当前虚拟机且不创建新虚拟机
true表示设置脚本成功
*/
bool setScript(LPCSTR sText);
/* 获取调用堆栈字符串
*/
const char* GetCallStack();
/*
* Comments: setScript(LPCSTR sText)
* Param LPCTSTR szScript:
* Param CDataPacket& packet: bCompile为true
* Param LPCTSTR name:
* Param bool bCompile: true会先编译脚本为二进制
* @Return bool: truefalse
* @Remark:
*/
bool setBinScript(LPCTSTR szScript, CDataPacket& packet, LPCTSTR name = NULL, bool bCompile = false);
/*
* Comments:
* Param CDataPacket & packet:
* @Return bool:
* @Remark:
*/
bool resetBinScript(CDataPacket& packet);
//获取虚拟机的内存使用量,单位是字节
int getAvaliableMemorySize();
//进行垃圾回收,释放内存。函数返回回收了多少字节的内存
int gc();
//获取错误号
inline int getLastErrorNo(){ return m_nLastError; }
//获取错误描述
inline const RefString& getLastErrorDesc() const { return m_sLastErrDesc; }
};