跳到主要内容

客户端快速改动手册(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 项目自动升级

  1. 使用 VS2022 打开项目

    右键 Client.vcproj → 打开方式 → Visual Studio 2022

    VS2022 会自动升级为 .vcxproj

  2. 重复操作

    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

📋 编译顺序

  1. 编译 engine 项目
  2. 编译 gui 项目
  3. 编译 RenderD3D 项目
  4. 编译 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 渲染正常(无黑屏)
  • 网络能连接服务器
  • 登录游戏成功

如果以上都通过,说明升级基本成功!


💡 提示

  1. 先备份:升级前完整备份 client-code/ 目录
  2. 逐个项目编译:不要一次性编译所有项目
  3. 保留原 VS2003 环境:如果升级失败,可以回退
  4. 记录错误:遇到错误时,记录完整的错误信息
  5. 搜索解决方案:大多数错误都能在网上找到解决方案

📞 需要帮助?

如果遇到以下情况,可能需要深入研究:

  • DirectX 渲染相关问题(黑屏、崩溃)
  • Boost luabind 集成问题
  • Lua 脚本执行错误
  • 网络协议不兼容

建议:

  • 使用调试器逐步调试
  • 检查日志输出
  • 与服务器端开发者确认协议细节

祝升级顺利!