客户端快速改动手册(VS2003 → VS2022)
快速参考,直接修改清单
🔴 P0 - 必须立即修改(核心阻塞问题)
1. 修改 Client/public.h(第170-184行)
删除 EXECryptor 代码:
// 原代码:
#define USE_EXECRYPT_API
#ifdef USE_EXECRYPT_API
#include "./execryptor.h"
#define FUNCTION_BEGIN_NEW CRYPT_START FUNCTION_BEGIN
#define FUNCTION_END_NEW FUNCTION_END CRYPT_END
#else
#define FUNCTION_BEGIN_NEW FUNCTION_BEGIN
#define FUNCTION_END_NEW FUNCTION_END
#endif
// 改为:
#define FUNCTION_BEGIN_NEW FUNCTION_BEGIN
#define FUNCTION_END_NEW FUNCTION_END
2. 修改 Client/public.h(第57-58行)和 Client/public.cpp(第4-5行)
线程局部存储:
// 原代码:
extern __declspec(thread) stCallStackInfo g_callStack[256];
extern __declspec(thread) int g_callStackIndex = -1;
// 改为:
extern thread_local stCallStackInfo g_callStack[256];
extern thread_local int g_callStackIndex = -1;
3. 修改所有使用 stdext::hash_map 的文件
批量替换:
// 原代码:
#include <hash_map>
stdext::hash_map<Key, Value> myMap;
// 改为:
#include <unordered_map>
std::unordered_map<Key, Value> myMap;
需要修改的文件:
✓ engine/include/Ini.h
✓ engine/include/engine.h
✓ engine/source/Ini.cpp
✓ engine/source/PhraseFilter.cpp
✓ engine/source/FilePackHelper.cpp
✓ RenderD3D/include/D3DMBitmap.h
✓ RenderD3D/include/D3DDevice.h
✓ Property/cTableManager.h
✓ Magic/cAnimation.cpp
✓ Magic/HashMapStrToNum.h
✓ Client/CountryInfo.h
4. 删除文件
直接删除这些文件:
❌ Client/execryptor.h
❌ Client/execryptor.cpp
🟡 P1 - 依赖库升级
5. Boost 升级
下载:
https://www.boost.org/users/download/
下载 Boost 1.81.0
解压到:client-code/boost_1_81_0/
编译 Boost(仅必要的库):
cd client-code/boost_1_81_0
bootstrap.bat
b2 --toolset=msvc-14.3 --with-system --with-thread --with-filesystem --with-date_time
修改项目设置:
项目属性 → C/C++ → 常规 → 附加包含目录
将 ../boost_1_34_1 改为 ../boost_1_81_0
项目属性 → 链接器 → 常规 → 附加库目录
添加:../boost_1_81_0/stage/lib
6. Lua 升级
下载:
https://www.lua.org/ftp/lua-5.4.4.tar.gz
解压到:client-code/lua-5.4.4/
修改项目设置:
项目属性 → C/C++ → 常规 → 附加包含目录
将 ../lua-5.0.3/include 改为 ../lua-5.4.4/src
7. luabind 升级
下载:
git clone https://github.com/luabind/luabind.git
替换 client-code/luabind/ 目录
🟢 P2 - 项目配置
8. VS 项目自动升级
-
使用 VS2022 打开项目:
右键 Client.vcproj → 打开方式 → Visual Studio 2022VS2022 会自动升级为
.vcxproj -
重复操作:
engine.vcproj → VS2022
gui.vcproj → VS2022
RenderD3D.vcproj → VS2022
9. 项目配置设置
所有项目都需要设置:
配置:Debug 和 Release 都需要设置
【C/C++】→【语言】
C++ 语言标准:ISO C++17 标准 (/std:c++17)
【C/C++】→【代码生成】
运行时库:多线程 DLL (/MD) [Release]
多线程调试 DLL (/MDd) [Debug]
【C/C++】→【预处理器】
预处理器定义:添加 _CRT_SECURE_NO_WARNINGS
【C/C++】→【预编译头】
预编译头:使用 (/Yu)
预编译头文件:public.h
【链接器】→【输入】
附加依赖项:
d3d9.lib
d3dx9.lib
dsound.lib
winmm.lib
comctl32.lib
10. 包含目录设置
【C/C++】→【常规】→【附加包含目录】
../
../engine/include
../gui/include
../RenderD3D/include
../boost_1_81_0
../lua-5.4.4/src
../luabind
📋 编译顺序
- 编译 engine 项目
- 编译 gui 项目
- 编译 RenderD3D 项目
- 编译 Client 项目
⚠️ 常见编译错误和解决方案
错误1:stdext::hash_map 不存在
// 解决方案:见第3步,替换为 std::unordered_map
错误2:__declspec(thread) 不支持 x64
// 解决方案:见第2步,改为 thread_local
错误3:_emit 不是合法指令
// 解决方案:见第1步,删除 EXECryptor 相关代码
错误4:找不到 lua_open
// 解决方案:替换为 luaL_newstate
lua_State *L = luaL_newstate();
错误5:Boost 相关链接错误
// 解决方案:确保 Boost 已编译并添加到库目录
// 检查项目属性中的附加库目录是否正确
错误6:_CRT_SECURE_NO_WARNINGS 宏未定义
// 解决方案:见第9步,添加到预处理器定义
// 或在代码开头添加:
#define _CRT_SECURE_NO_WARNINGS
🧪 快速测试清单
编译成功后,运行以下测试:
- 客户端 exe 能正常生成
- 双击 exe 能启动
- 登录界面显示正常
- DirectX 渲染正常(无黑屏)
- 网络能连接服务器
- 登录游戏成功
如果以上都通过,说明升级基本成功!
💡 提示
- 先备份:升级前完整备份
client-code/目录 - 逐个项目编译:不要一次性编译所有项目
- 保留原 VS2003 环境:如果升级失败,可以回退
- 记录错误:遇到错误时,记录完整的错误信息
- 搜索解决方案:大多数错误都能在网上找到解决方案
📞 需要帮助?
如果遇到以下情况,可能需要深入研究:
- DirectX 渲染相关问题(黑屏、崩溃)
- Boost luabind 集成问题
- Lua 脚本执行错误
- 网络协议不兼容
建议:
- 使用调试器逐步调试
- 检查日志输出
- 与服务器端开发者确认协议细节
祝升级顺利!