From 44ea52a10a8d1108c5c9342b204ebd003cb07edb Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Fri, 22 Apr 2022 02:16:45 +0800 Subject: [PATCH] =?UTF-8?q?Json=20stl=E6=8B=93=E5=B1=95=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/DNFTOOL.cpp | 26 +++++++++ test/DNFTOOL.h | 12 ++++ test/STL.cpp | 8 +-- test/STL.h | 22 +++---- test/framework.h | 6 +- test/hook.cpp | 2 +- test/squirrel.cpp | 144 +++++++++++++++++++++++++++++++++++++++++----- test/squirrel.h | 69 ++++++++++++++++++---- test/test.vcxproj | 3 +- 9 files changed, 250 insertions(+), 42 deletions(-) diff --git a/test/DNFTOOL.cpp b/test/DNFTOOL.cpp index d207ea5..522121d 100644 --- a/test/DNFTOOL.cpp +++ b/test/DNFTOOL.cpp @@ -248,6 +248,22 @@ char* DNFTOOL::UnicodeToAnsi(const wchar_t* szStr, char* pResult, int maxLen) return pResult; } +char* DNFTOOL::wchar_tTochar(wchar_t* wbuffer) +{ + size_t requiredSize = wcstombs(nullptr, wbuffer, 0); + char* key = new char[requiredSize + 1]; + wcstombs(key, wbuffer, requiredSize + 1); + return key; +} + +wchar_t* DNFTOOL::charTowchar_t(char* wbuffer) +{ + size_t requiredSize = mbstowcs(nullptr, wbuffer, 0); + wchar_t* wcString = new wchar_t[requiredSize + 1]; + mbstowcs(wcString, wbuffer, requiredSize + 1); + return wcString; +} + wchar_t* DNFTOOL::AnsiToUnicode(const char* szStr, wchar_t* pResult, int maxLen) { if (NULL == pResult) @@ -321,3 +337,13 @@ void DNFTOOL::Wchar_tToString(std::string& szDst, wchar_t* wchar) szDst = psText;// std::string赋值 delete[]psText;// psText的清除 } + + +const wchar_t* DNFTOOL::GetWC(const char* c) +{ + const size_t cSize = strlen(c) + 1; + wchar_t* wc = new wchar_t[cSize]; + mbstowcs(wc, c, cSize); + + return wc; +} \ No newline at end of file diff --git a/test/DNFTOOL.h b/test/DNFTOOL.h index a12b15a..95c11c0 100644 --- a/test/DNFTOOL.h +++ b/test/DNFTOOL.h @@ -72,12 +72,24 @@ public: //获取装备偏移地址 static int GetEquAddr(int addr); + + //wchar_t* 转 char* static char* UnicodeToAnsi(const wchar_t* szStr, char* pResult, int maxLen); + + + //wchar_t* 转 char* 有用 + static char* wchar_tTochar(wchar_t* wbuffer); + //char* 转 wchar_t* 有用 + static wchar_t* charTowchar_t(char* wbuffer); + //wchar_t* 转 string* static void Wchar_tToString(std::string& szDst, wchar_t* wchar); //char* 转 wchar_t* static wchar_t* AnsiToUnicode(const char* szStr, wchar_t* pResult, int maxLen); + //string 转 wchar_t* + static const wchar_t* GetWC(const char* c); + //窗口公告 0x10d static void WindowsNotice(char* str, int type = 0x10d, int b = 0x0); diff --git a/test/STL.cpp b/test/STL.cpp index 6346a1d..6eadc11 100644 --- a/test/STL.cpp +++ b/test/STL.cpp @@ -170,7 +170,7 @@ void STL::SetIntArr_STL(std::string name, int idx, int value) IntArr_STL[name][idx] = value; } -void STL::SetFloatArr_STL(std::string name, int idx, float value) +void STL::SetFloatArr_STL(std::string name, int idx, FLOAT value) { FloatArr_STL[name][idx] = value; } @@ -180,7 +180,7 @@ void STL::SetStringArr_STL(std::string name, int idx, std::string value) StringArr_STL[name][idx] = value; } -void STL::SetBoolArr_STL(std::string name, int idx, bool value) +void STL::SetBoolArr_STL(std::string name, int idx, BOOL value) { BoolArr_STL[name][idx] = value; } @@ -190,7 +190,7 @@ int STL::GetIntArr_STL(std::string name, int idx) return IntArr_STL[name][idx]; } -float STL::GetFloatArr_STL(std::string name, int idx) +FLOAT STL::GetFloatArr_STL(std::string name, int idx) { return FloatArr_STL[name][idx]; } @@ -200,7 +200,7 @@ std::string STL::GetStringArr_STL(std::string name, int idx) return StringArr_STL[name][idx]; } -bool STL::GetBoolArr_STL(std::string name, int idx) +BOOL STL::GetBoolArr_STL(std::string name, int idx) { return BoolArr_STL[name][idx]; } diff --git a/test/STL.h b/test/STL.h index 16c6098..93a62b5 100644 --- a/test/STL.h +++ b/test/STL.h @@ -5,25 +5,25 @@ //构造int类型容器 static std::mapInt_STL; //构造float类型容器 -static std::mapFloat_STL; +static std::mapFloat_STL; //构造string类型容器 static std::mapString_STL; //构造bool类型容器 -static std::mapBool_STL; +static std::mapBool_STL; //构造intarr类型容器 static std::map>IntArr_STL; //构造floatarr类型容器 -static std::map>FloatArr_STL; +static std::map>FloatArr_STL; //构造stringarr类型容器 static std::map>StringArr_STL; //构造boolarr类型容器 -static std::map>BoolArr_STL; +static std::map>BoolArr_STL; static std::mapaod; -static std::mapbod; +static std::mapbod; static std::mapcod; -static std::mapdod; +static std::mapdod; #endif //时间 STL @@ -63,6 +63,8 @@ static std::mapDargonState_STL; static std::mapDargonModel_STL; #endif + + class STL { private: @@ -84,15 +86,15 @@ public: //设置 Int数组容器 static void SetIntArr_STL(std::string name,int idx,int value); - static void SetFloatArr_STL(std::string name,int idx,float value); + static void SetFloatArr_STL(std::string name,int idx, FLOAT value); static void SetStringArr_STL(std::string name,int idx,std::string value); - static void SetBoolArr_STL(std::string name,int idx,bool value); + static void SetBoolArr_STL(std::string name,int idx,BOOL value); //获取 Int数组容器 static int GetIntArr_STL(std::string name, int idx); - static float GetFloatArr_STL(std::string name, int idx); + static FLOAT GetFloatArr_STL(std::string name, int idx); static std::string GetStringArr_STL(std::string name, int idx); - static bool GetBoolArr_STL(std::string name, int idx); + static BOOL GetBoolArr_STL(std::string name, int idx); #endif //龙盒 diff --git a/test/framework.h b/test/framework.h index ceadb28..80118b3 100644 --- a/test/framework.h +++ b/test/framework.h @@ -23,12 +23,14 @@ +#pragma warning(disable:4244) -//#define LOCALHOSTS_SWITCH "鏈湴鍏嶉獙璇 寮鍚" + +#define LOCALHOSTS_SWITCH "鏈湴鍏嶉獙璇 寮鍚" @@ -46,7 +48,7 @@ #define DRAGONBOX_SWITCH "榫欑洅寮鍚" #define NORMAL_STL "鏅歋TL寮鍚" #define TIME_STL "鏃堕棿STL寮鍚" - +#define JSON_STL "Json_STL 寮鍚" diff --git a/test/hook.cpp b/test/hook.cpp index ca7628f..16ab628 100644 --- a/test/hook.cpp +++ b/test/hook.cpp @@ -51,7 +51,7 @@ uint32_t ThFunc(uint32_t v) SQGetString(v, i, &Name); if (bufferm.count(Name) == 0) { - bufferm[Name] == 1; + bufferm[Name] = 1; std::wcout << u8"参数为" << Name << std::endl; } diff --git a/test/squirrel.cpp b/test/squirrel.cpp index a8e6113..20d964f 100644 --- a/test/squirrel.cpp +++ b/test/squirrel.cpp @@ -4,12 +4,10 @@ #include "RSAC.h" #include "STL.h" -int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, bool printerror) +int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, BOOL printerror) { //wchar_t* 转 char* - int size = wcslen(filename); - char* fname = (char*)new char[size]; - DNFTOOL::UnicodeToAnsi(filename, fname, size); + char* fname = DNFTOOL::wchar_tTochar((wchar_t*)filename); FILE* file; file = fopen(fname, "rb"); @@ -55,7 +53,7 @@ int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, bool printerror) return -1; } -int squirrel::SQdofile(uint32_t v, const wchar_t* filename, bool retval, bool printerror) +int squirrel::SQdofile(uint32_t v, const wchar_t* filename, BOOL retval, BOOL printerror) { if (SQloadfile(v, filename, printerror) >= 0) { @@ -274,14 +272,9 @@ int squirrel::SendPackWChar(uint32_t v) wchar_t* n1; SQGetString(v, 2, &n1); - std::wcout << u8"字符串值为:" << n1 << std::endl; //wchar_t* 转 char* - int size = wcslen(n1); - char* fname = (char*)new char[size]; - DNFTOOL::UnicodeToAnsi(n1, fname, size); - fname[size] = '\0'; - std::cout << u8"字符串值为:" << fname << std::endl; + char* fname = DNFTOOL::wchar_tTochar(n1); _SendPacksChar(*_SendClass, 0, fname, strlen(fname)); SQPushInt(v, 1); @@ -724,9 +717,9 @@ int squirrel::Set_STL(uint32_t v) int ParameterNum = SQGetTop(v); int IntValue; - float FloatValue; + FLOAT FloatValue; char* StrValue; - bool BoolValue; + BOOL BoolValue; if (ParameterNum == 5) { //获取容器名字 @@ -1059,6 +1052,126 @@ int squirrel::Set_DragonModel(uint32_t v) #endif + +#if defined JSON_STL +//构造Json类型容器 +static std::mapJson_STL; +//Json容器 +int squirrel::Jsoner_STL(uint32_t v) +{ + wchar_t* Name; + int Type; + int ParameterNum = SQGetTop(v); + if (ParameterNum == 3) + { + //获取容器名字 + SQGetString(v, 2, &Name); + //获取模式 + SQGetInt(v, 3, &Type); + + switch (Type) + { + case 0://构造 + { + if (Json_STL.count(Name) != 0)//如果这个hash不存在 就创建 + { + //构造对应 hash 的 Json容器 + std::string str = ""; + Json_STL[Name] = str; + } + else + { + SQPushBool(v, false); + return 1; + } + break; + } + case 1://读取 + { + wchar_t* buffer = DNFTOOL::charTowchar_t((char*)Json_STL[Name].c_str()); + SQPushString(v, buffer, wcslen(buffer));//传给nut + return 1; + break; + } + } + + SQPushBool(v, true); + } + else if (ParameterNum == 4) + { + //获取容器名字 + SQGetString(v, 2, &Name); + //获取Key 的名字 + wchar_t* keybuffer; + SQGetString(v, 3, &keybuffer); + //转化为可用Key + char* key = DNFTOOL::wchar_tTochar(keybuffer); + + //构造json dom + rapidjson::Document Dom; + Dom.Parse(Json_STL[Name].c_str());//加载 字符串 + if(Json_STL[Name].length() == 0 )Dom.SetObject();//如果未初始化就初始化一次 + + rapidjson::Value BB; + + //获取值的类型 + int ValueType = SQ_GetType(v, 4); + //判断值类型 + switch (ValueType) + { + case OT_INTEGER://int类型 + { + int Value; + SQGetInt(v, 4, &Value); + BB.SetInt(Value); + break; + } + case OT_FLOAT://float类型 + { + FLOAT Value; + SQGetFloat(v, 4, &Value); + BB.SetFloat(Value); + break; + } + case OT_BOOL://bool类型 + { + BOOL Value; + SQGetBool(v, 4, &Value); + BB.SetBool(Value); + break; + } + case OT_STRING://string类型 + { + wchar_t* Value; + SQGetString(v, 4, &Value); + char* str = DNFTOOL::wchar_tTochar(Value); + BB.SetString(rapidjson::StringRef(str)); + break; + } + default: + break; + } + if (Dom[key].IsNull()) + { + Dom.AddMember(rapidjson::StringRef(key), BB, Dom.GetAllocator()); + } + + rapidjson::StringBuffer jsonBuffer; + rapidjson::Writer writer(jsonBuffer); + Dom.Accept(writer); + Json_STL[Name] = jsonBuffer.GetString(); + //delete[] key; + SQPushBool(v, true); + } + else + { + SQPushBool(v, false); + } + + return 1; +} +#endif + //获取Squirrel v 基址 inline uint32_t GetSqVm() { @@ -1142,6 +1255,11 @@ void squirrel::R_Register_Nut() RegisterNutApi(L"L_Timer_STL", squirrel::Timer_STL);//时间容器 #endif + //Json STL +#if defined JSON_STL + RegisterNutApi(L"L_Json_STL", squirrel::Jsoner_STL);//时间容器 +#endif + //龙盒 #if defined DRAGONBOX_SWITCH RegisterNutApi(L"L_Get_DragonModel", squirrel::Get_DragonModel);//获取龙盒模式 diff --git a/test/squirrel.h b/test/squirrel.h index dfefd5d..1db8bdc 100644 --- a/test/squirrel.h +++ b/test/squirrel.h @@ -14,7 +14,7 @@ static realSqNewClosure* RealSqNewClosure = (realSqNewClosure*)0x135B850; #define INIT_NUT_ADDRESS 0x135B850 static realSqNewClosure* MLnewclosure = nullptr; // New槽 -typedef int(SqNewSlot)(uint32_t v, int a, bool b); +typedef int(SqNewSlot)(uint32_t v, int a, BOOL b); static SqNewSlot* SQNewSlot = (SqNewSlot*)0x135AA80; // 平栈 typedef int(SqPopTop)(uint32_t v); @@ -25,9 +25,55 @@ static SqPop* SQPop = (SqPop*)0x1358FD0; //SQ_Get typedef int(Sq_Get)(uint32_t v, int n); static Sq_Get* SQ_Get = (Sq_Get*)0x135AE30; -//SQ_Get + +#define _RT_NULL 0x00000001 +#define _RT_INTEGER 0x00000002 +#define _RT_FLOAT 0x00000004 +#define _RT_BOOL 0x00000008 +#define _RT_STRING 0x00000010 +#define _RT_TABLE 0x00000020 +#define _RT_ARRAY 0x00000040 +#define _RT_USERDATA 0x00000080 +#define _RT_CLOSURE 0x00000100 +#define _RT_NATIVECLOSURE 0x00000200 +#define _RT_GENERATOR 0x00000400 +#define _RT_USERPOINTER 0x00000800 +#define _RT_THREAD 0x00001000 +#define _RT_FUNCPROTO 0x00002000 +#define _RT_CLASS 0x00004000 +#define _RT_INSTANCE 0x00008000 +#define _RT_WEAKREF 0x00010000 + +#define SQOBJECT_REF_COUNTED 0x08000000 +#define SQOBJECT_NUMERIC 0x04000000 +#define SQOBJECT_DELEGABLE 0x02000000 +#define SQOBJECT_CANBEFALSE 0x01000000 + +typedef enum tagSQObjectType { + OT_NULL = (_RT_NULL | SQOBJECT_CANBEFALSE), + OT_INTEGER = (_RT_INTEGER | SQOBJECT_NUMERIC | SQOBJECT_CANBEFALSE), + OT_FLOAT = (_RT_FLOAT | SQOBJECT_NUMERIC | SQOBJECT_CANBEFALSE), + OT_BOOL = (_RT_BOOL | SQOBJECT_CANBEFALSE), + OT_STRING = (_RT_STRING | SQOBJECT_REF_COUNTED), + OT_TABLE = (_RT_TABLE | SQOBJECT_REF_COUNTED | SQOBJECT_DELEGABLE), + OT_ARRAY = (_RT_ARRAY | SQOBJECT_REF_COUNTED), + OT_USERDATA = (_RT_USERDATA | SQOBJECT_REF_COUNTED | SQOBJECT_DELEGABLE), + OT_CLOSURE = (_RT_CLOSURE | SQOBJECT_REF_COUNTED), + OT_NATIVECLOSURE = (_RT_NATIVECLOSURE | SQOBJECT_REF_COUNTED), + OT_GENERATOR = (_RT_GENERATOR | SQOBJECT_REF_COUNTED), + OT_USERPOINTER = _RT_USERPOINTER, + OT_THREAD = (_RT_THREAD | SQOBJECT_REF_COUNTED), + OT_FUNCPROTO = (_RT_FUNCPROTO | SQOBJECT_REF_COUNTED), //internal usage only + OT_CLASS = (_RT_CLASS | SQOBJECT_REF_COUNTED), + OT_INSTANCE = (_RT_INSTANCE | SQOBJECT_REF_COUNTED | SQOBJECT_DELEGABLE), + OT_WEAKREF = (_RT_WEAKREF | SQOBJECT_REF_COUNTED) +}SQObjectType; +//SQ_GetType typedef int(Sq_GetType)(uint32_t v, int n); static Sq_GetType* SQ_GetType = (Sq_GetType*)0x1358CD0; + + + //SQ_Rawget typedef int(Sq_Rawget)(uint32_t v, int n); static Sq_Rawget* SQ_Rawget = (Sq_Rawget*)0x135AEA0; @@ -47,10 +93,10 @@ static SQ_RemoveFunc* SQ_Remove = (SQ_RemoveFunc*)0x1359000; typedef int(SqGetIntFunc)(uint32_t v, uint32_t stackIndex, int* sint); static SqGetIntFunc* SQGetInt = (SqGetIntFunc*)0x1358D70; //GetFloat -typedef int(SqGetFloatFunc)(uint32_t v, uint32_t stackIndex, float* sfloat); +typedef int(SqGetFloatFunc)(uint32_t v, uint32_t stackIndex, FLOAT* sfloat); static SqGetFloatFunc* SQGetFloat = (SqGetFloatFunc*)0x1358DD0; //GetBool -typedef int(SqGetBoolFunc)(uint32_t v, uint32_t stackIndex, bool* sbool); +typedef int(SqGetBoolFunc)(uint32_t v, uint32_t stackIndex, BOOL* sbool); static SqGetBoolFunc* SQGetBool = (SqGetBoolFunc*)0x1358E30; //GetString typedef int(SqGetStringFunc)(uint32_t v, uint32_t stackIndex, wchar_t** sstring); @@ -81,19 +127,19 @@ static SqPushStringFuncs* SQPushStringc = (SqPushStringFuncs*)0x1358A60; typedef int(SqPushIntFunc)(uint32_t v, int sint); static SqPushIntFunc* SQPushInt = (SqPushIntFunc*)0x1358AD0; //PushBool -typedef int(SqPushBoolFunc)(uint32_t v, bool sbool); +typedef int(SqPushBoolFunc)(uint32_t v, BOOL sbool); static SqPushBoolFunc* SQPushBool = (SqPushBoolFunc*)0x1358B10; //PushFloat -typedef int(SqPushFloatFunc)(uint32_t v, float sfloat); +typedef int(SqPushFloatFunc)(uint32_t v, FLOAT sfloat); static SqPushFloatFunc* SQPushFloat = (SqPushFloatFunc*)0x1358B60; //SQLOADFILE -typedef void* (SQLOADFILEFunc)(uint32_t v, const wchar_t* filename, bool printerror); +typedef void* (SQLOADFILEFunc)(uint32_t v, const wchar_t* filename, BOOL printerror); static SQLOADFILEFunc* SQLOADFILEF = (SQLOADFILEFunc*)0x13560E0; //SQDOFILE -typedef void* (SQDOFILEFunc)(uint32_t v, const wchar_t* filename, bool retval, bool printerror); +typedef void* (SQDOFILEFunc)(uint32_t v, const wchar_t* filename, BOOL retval, BOOL printerror); static SQDOFILEFunc* SQDOFILE = (SQDOFILEFunc*)0x1356240; @@ -130,7 +176,7 @@ static SQ_ReadclosureFunc* SQ_Readclosure = (SQ_ReadclosureFunc*)0x1359460; typedef int(SQ__FcloseFunc)(void* file); static SQ__FcloseFunc* SQ__Fclose = (SQ__FcloseFunc*)0x1355E70; //SQ_Compile -typedef int(SQ_CompileFunc)(uint32_t v, LSQLEXREADFUNC FUNC, void* file, const wchar_t* filename, bool printerror); +typedef int(SQ_CompileFunc)(uint32_t v, LSQLEXREADFUNC FUNC, void* file, const wchar_t* filename, BOOL printerror); static SQ_CompileFunc* SQ_Compile = (SQ_CompileFunc*)0x135A390; //SQ_Throwerror typedef int(SQ_ThrowerrorFunc)(uint32_t v, const wchar_t* error); @@ -146,8 +192,8 @@ private: public://加载 - static int SQloadfile(uint32_t v, const wchar_t* filename, bool printerror); - static int SQdofile(uint32_t v, const wchar_t* filename, bool retval, bool printerror); + static int SQloadfile(uint32_t v, const wchar_t* filename, BOOL printerror); + static int SQdofile(uint32_t v, const wchar_t* filename, BOOL retval, BOOL printerror); public://NUT API 接口 static int sq_Test(uint32_t v);//测试接口 @@ -183,6 +229,7 @@ public:// static int Set_STL(uint32_t v);//设置 类型容器 static int New_STL(uint32_t v);//new 类型容器 static int Timer_STL(uint32_t v);//时间容器 + static int Jsoner_STL(uint32_t v);//时间容器 public://龙盒 static int Sync_Dragon_Pack(uint32_t v);//同步 龙盒数据包 diff --git a/test/test.vcxproj b/test/test.vcxproj index 587e094..4a2fa51 100644 --- a/test/test.vcxproj +++ b/test/test.vcxproj @@ -79,7 +79,8 @@ false D:\BaiduNetdiskWorkspace\DOF-Lenheart\Plugins\ - E:\Testnixiang\test\test\OpenSSL-Win32\lib;E:\Testnixiang\test\test\OpenSSL-Win32\lib\VC;$(LibraryPath) + E:\openssl\lib;E:\Testnixiang\test\test\OpenSSL-Win32\lib;E:\Testnixiang\test\test\OpenSSL-Win32\lib\VC;$(LibraryPath) + E:\openssl\include;$(IncludePath) true