打包發布與使用教學
本篇定位
這是 Phase 8「整合測試與發布」的第 2 篇。 開發和測試完成後,如何把登入器打包成玩家能直接使用的版本?這篇說明 Release 編譯設定、打包內容、安裝步驟,以及給玩家的使用說明。
完成本篇後,你已掌握登入器的完整開發到發布流程。想更深入了解 MapleStory 引擎的內部型別系統(ZAllocEx、ZXString、TSecType 等),請繼續閱讀 Phase 9:MapleStory 內部型別系統(進階選讀)。
一、Release 編譯設定
1.1 切換到 Release x86 設定
Visual Studio 頂部工具列:
[Debug ▼] → Release
[x64 ▼] → x86
為什麼必須是 x86?
MapleStory v83 是 32 位元程式,只能載入 32 位元 DLL。如果誤用 x64 編譯,遊戲會報錯「不是有效的 Win32 應用程式」並拒絕載入。
1.2 Release 和 Debug 的關鍵差異
| 設定 | Debug 模式 | Release 模式 |
|---|---|---|
| 最佳化 | 關閉(/Od) | 最高(/O2) |
| 除錯資訊 | 完整 .pdb 檔 | 無(或精簡) |
| 斷言(assert) | 啟用 | 停用 |
| DLL 大小 | 較大 | 較小 |
| 執行速度 | 慢 | 快 |
| 載入進遊戲 | 可能有問題(CRT 版本差異) | 正常 |
確認 Runtime Library 設定
在 Project Properties → C/C++ → Code Generation → Runtime Library:
- 選 Multi-threaded (/MT)(靜態連結 CRT)
- 不要選 Multi-threaded DLL (/MD)
靜態連結確保玩家的電腦不需要額外安裝 Visual C++ Redistributable,DLL 完全自給自足。
1.3 額外最佳化建議
Project Properties → C/C++ → Optimization:
Optimization: Maximize Speed (/O2)
Inline Function Expansion: Only __inline (/Ob1)
Project Properties → Linker → General:
Enable Incremental Linking: No (/INCREMENTAL:NO)
二、打包內容
測試通過後,準備發布包,只需要以下幾個檔案:
MapleEzorsia-v2_vX.X.zip
├── dinput8.dll ← 編譯好的登入器(Release x86)
├── dinput8.ini ← 預設設定檔(IP 填私服地址)
└── README.txt ← 安裝說明(見下節)
不包含的東西
MapleStory.exe:由玩家自行取得(版權問題).pdb偵錯符號檔:不包含(避免暴露原始碼資訊)- WZ 資源檔案:如有自訂 WZ,另外打包或說明下載連結
三、README.txt 範本
MapleEzorsia-v2 登入器 v2.x
================================
適用版本:GMS v83.1(EXE MD5: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)
【安裝步驟】
1. 確認你有 GMS v83 的 MapleStory.exe
2. 把 dinput8.dll 和 dinput8.ini 放進遊戲資料夾
(和 MapleStory.exe 同一個資料夾)
3. 用文字編輯器(記事本)打開 dinput8.ini
修改 ServerIP 為私服伺服器的 IP 位址
4. 直接雙擊 MapleStory.exe 啟動遊戲(不需要啟動器)
【設定說明】
ServerIP = 伺服器 IP(向私服管理員取得)
Port = 8484(通常不需要修改)
Width = 1280(視窗寬度,建議和螢幕解析度相同或更小)
Height = 720 (視窗高度)
Windowed = true(true = 視窗模式,false = 全螢幕)
【常見問題】
Q: 點擊 MapleStory.exe 後沒有反應?
A: 確認 dinput8.dll 和 MapleStory.exe 在同一個資料夾。
Q: 遊戲視窗太小或太大?
A: 修改 dinput8.ini 的 Width 和 Height,存檔後重新啟動遊戲。
Q: 連不上伺服器?
A: 確認 ServerIP 填寫正確,且私服伺服器正在運行中。
四、安裝流程圖(給玩家看的)
玩家的遊戲資料夾
├── MapleStory.exe ← 玩家已有
├── *.wz ← 玩家已有
│
│ ↓ 解壓縮登入器發布包
│
├── dinput8.dll ← 新增
└── dinput8.ini ← 新增,然後修改 ServerIP
│
↓ 雙擊 MapleStory.exe
登入器自動啟動,連接私服
五、版本管理與更新策略
版本號規則
建議遵循語意化版本(Semantic Versioning):
v2.1.3
│ │ └── Patch:修復 bug(不改功能)
│ └──── Minor:新增功能(向下相容)
└────── Major:破壞性變更(例如支援新的 EXE 版本)
更新時需要重新逆向的情境
| 變更 | 需要重新逆向? |
|---|---|
| 私服更換 IP | 不需要(只改 ini) |
| 解析度 bug 修正 | 不需要(改程式碼邏輯,地址不變) |
| 私服升級 EXE 版本 | 需要(所有地址可能改變) |
| 新增功能(支援新解析度) | 不需要,除非新功能依賴新地址 |
版本鎖定
在 DLL 啟動時,驗證 EXE 的 MD5 或版本號,如果不符就顯示錯誤並退出:
// 確認 EXE 版本正確(避免玩家用錯誤版本的 EXE) if (!VerifyGameVersion()) { MessageBoxA(NULL, "Incompatible MapleStory.exe version.\n" "Please use GMS v83.1 (MD5: XXXX...)", "Version Mismatch", MB_ICONERROR); ExitProcess(1); }
六、整套課程回顧
到這裡,你已經學完了 MapleEzorsia-v2 登入器的完整核心技術:
Phase 1 基礎概念 → DLL 劫持、Proxy DLL、開發環境
Phase 2 專案結構 → dllmain.cpp、dinput8.cpp Proxy 載入器
Phase 3 記憶體操作 → 指標、Memory.cpp、地址表、型別定義
Phase 4 Hook 技術 → Inline Hook、Detours、Code Cave
Phase 5 Client.cpp → 解析度修改(三層次)、UI 座標換算
Phase 6 進階功能 → 函式替換、自訂記憶體分配器、初始化流程
Phase 7 設定與資源 → INI 解析器、WZ 資源系統 Hook
Phase 8 測試與發布 → 除錯工具、Release 編譯、打包發布
─────────────────────────────────────────(進階選讀)
Phase 9 引擎型別系統 → ZAllocEx、ZXString、ZRef、TSecType 等內部型別
Phase 9 是選修還是必修?
Phase 8 結束後你已能完整使用與修改登入器。Phase 9 是給「想深入理解 MapleStory 引擎內部,或準備撰寫進階 Hook(直接操作遊戲物件)」的學習者設計的進階內容,可按需選讀。
延伸學習路線
如果想繼續深入,建議的方向:
| 方向 | 推薦資源 | | ------------------- | --------------------------------------------------------------------------- | ------------------------------ | | 逆向工程 | IDA Pro 教學、x64dbg 教學、「逆向工程核心原理」書籍 | | Windows 記憶體模型 | Windows Internals(Russinovich 著) | | DirectX / Direct3D | DirectX SDK 文件、「Introduction to 3D Game Programming with DirectX 9.0c」 | | MapleStory 引擎深度 | RageZone.com 的 v83 開發論壇 | | 本章課程地圖 | MapleEzorsia-v2 課程入門導覽 |
延伸閱讀
- 01_如何測試與除錯DLL — 上一篇:測試流程與除錯工具
- MapleEzorsia-v2 課程入門導覽 — 回到本章首頁
- 01_Client.cpp整體架構導覽 — 複習整個 Client 模組