如何編譯第一個 DLL:從原始碼到 dinput8.dll
前置條件
在開始之前,請確認你已經完成 Phase 1 第 4 篇:安裝 Visual Studio,並且已經下載好
MapleEzorsia-v2-main的原始碼資料夾。
什麼是「編譯」?
用最簡單的說法:編譯就是把你看得懂的程式碼(文字),變成電腦看得懂的機器語言(.dll 檔案)的過程。
我們的目標是把 ezorsia/ 資料夾裡的 .cpp 原始碼,透過 Visual Studio 編譯成一個叫做 dinput8.dll 的檔案,再把它放進 MapleStory 遊戲目錄就能生效。
第一步:開啟專案
- 用檔案總管找到你下載的原始碼資料夾,進入
MapleEzorsia-v2-main/。 - 找到
Ezorsia V2.sln這個檔案(圖示是 Visual Studio 的紫色方塊)。 - 雙擊 這個
.sln檔案,Visual Studio 會自動開啟整個專案。
第一次開啟比較慢
Visual Studio 第一次載入專案時需要建立索引,可能要等 30 秒到 1 分鐘。畫面左下角出現「Ready」才代表載入完成。
- 載入完成後,右側的 Solution Explorer(方案總管)應該會出現
ezorsia這個專案名稱。
截圖建議 1
截哪裡:Solution Explorer 面板,顯示
ezorsia專案名稱展開的樹狀結構(可以看到dllmain.cpp、Client.cpp等檔案)。若 Solution Explorer 不見了,可以按選單 View → Solution Explorer 叫出來。
第二步:確認編譯設定(這步非常關鍵!)
這是最容易出錯的地方。編譯前必須確認兩個下拉選單的設定都正確。
在 Visual Studio 頂端工具列,找到兩個並排的下拉選單:
| 下拉選單 | 正確設定 | 錯誤設定 |
|---|---|---|
| Configuration(組態) | Release | Debug |
| Platform(平台) | x86 | x64 |
平台選錯會讓 DLL 無法運作!
MapleStory v83 是一個 32 位元(x86) 的程式。如果你把 Platform 選成 x64,編譯出來的 DLL 是 64 位元,放進遊戲目錄後完全沒有反應,遊戲不會有任何錯誤提示,只是靜靜地失效。一定要選 x86!
截圖建議 2
截哪裡:Visual Studio 頂端工具列,框出 Configuration 和 Platform 這兩個下拉選單,標記正確的設定「Release」和「x86(Win32)」。工具列通常在第二列,Ctrl+Shift+B 快速鍵旁邊附近。
第三步:開始編譯
確認設定後,選擇以下任一方法開始編譯:
- 方法一(快速鍵):按下
Ctrl + Shift + B - 方法二(選單):點選上方選單 Build → Build Solution
- 方法三(右鍵):在 Solution Explorer 的
ezorsia專案上按右鍵 → Build
編譯過程說明
編譯開始後,Visual Studio 畫面下方的 Output(輸出)視窗會顯示一行一行的編譯訊息。這很正常,不需要每行都看懂。只要最後一行出現以下訊息,就代表成功:
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
截圖建議 3
截哪裡:Output 視窗的最後幾行,特別是那行「Build: 1 succeeded」的訊息。如果 Output 視窗不見了,按選單 View → Output 叫出來。
第四步:找到輸出的 DLL 檔案
編譯成功後,輸出檔案會自動存放在以下位置(相對於 .sln 所在的資料夾):
MapleEzorsia-v2-main/
└── out/
└── Release/
├── dinput8.dll ← 主要的 DLL 檔案
├── config.ini ← 設定檔(自動複製過來)
└── EzorsiaV2_UI.wz ← UI 資源(自動複製過來)
用檔案總管進入 out\Release\ 資料夾,確認這三個檔案都存在。
看到這三個檔案就代表編譯完全成功!
config.ini和EzorsiaV2_UI.wz是因為專案設定了自動複製,所以會跟著dinput8.dll一起出現在輸出資料夾,不需要你手動複製。
截圖建議 4
截哪裡:用檔案總管開啟
out\Release\資料夾,顯示三個檔案的清單(名稱、類型、大小)。dinput8.dll的大小通常在幾百 KB 左右。
第五步:把 DLL 放到遊戲資料夾
- 找到你的 MapleStory 遊戲目錄(通常是
C:\Nexon\MapleStory\或你安裝私服時設定的路徑)。 - 把以下三個檔案全部複製進去:
dinput8.dllconfig.iniEzorsiaV2_UI.wz
三個檔案要一起複製
dinput8.dll在啟動時會讀取config.ini和EzorsiaV2_UI.wz,缺少任一個都會導致遊戲閃退或功能失效。
- 啟動遊戲,觀察遊戲視窗是否變成 HD 解析度(寬螢幕或更高解析度)。如果有變化,代表 DLL 已經成功被遊戲載入。
覆蓋舊檔案
如果遊戲目錄裡已經有舊版的
dinput8.dll,直接覆蓋即可。不需要先刪掉舊檔。
Debug 版本 vs Release 版本
你可能注意到 Configuration 除了 Release 之外還有 Debug 選項。兩者的差異如下:
| 比較項目 | Debug 版本 | Release 版本 |
|---|---|---|
| 用途 | 開發、測試、找 Bug | 實際使用 |
| 檔案大小 | 較大(含除錯符號) | 較小(已最佳化) |
| 執行速度 | 較慢 | 較快 |
| 輸出位置 | out\Debug\dinput8.dll | out\Release\dinput8.dll |
| 包含額外資訊 | 有(方便追蹤問題) | 無 |
給初學者的建議
如果你只是想用,直接用 Release 版本就好。如果你打算修改程式碼並追蹤問題,可以先用 Debug 版本測試,確認沒問題後再切換回 Release 編譯一次再使用。
常見錯誤排查
| 錯誤訊息 | 可能原因 | 解決方式 |
|---|---|---|
LNK1104: cannot open file 'detours.lib' | detours/ 資料夾沒有放在正確位置(必須和 .sln 同層) | 確認 MapleEzorsia-v2-main/detours/detours.lib 路徑存在 |
C1010: unexpected end of file while looking for precompiled header | stdafx.cpp 沒有被設定為「建立 PCH(Precompiled Header)」 | 在 Solution Explorer 右鍵 stdafx.cpp → Properties → C/C++ → Precompiled Headers → 設定為「Create (/Yc)」 |
C2065: 'xxx': undeclared identifier | 某個 .h 標頭檔遺失或 Include 路徑設定錯誤 | 確認所有原始碼檔案都有完整下載,沒有漏掉任何 .h 檔 |
| 編譯成功但放進遊戲後沒有效果 | Platform 選了 x64,編出 64 位元 DLL | 重新確認 Platform 設定為 x86,重新編譯 |
LNK2019: unresolved external symbol | 函式庫連結問題,Winmm.lib 或 Ws2_32.lib 沒有加入 | 確認 vcxproj 沒有被修改過;最簡單的方法是重新下載原始碼 |
開啟 .sln 後 Visual Studio 要求「Retarget」 | Toolset 版本不符(專案需要 v143,即 VS 2022) | 安裝 Visual Studio 2022,或安裝 v143 Build Tools |
找不到你的錯誤?
把 Output 視窗的完整錯誤訊息複製下來,用 Google 搜尋錯誤代碼(例如
LNK1104),通常都能找到解答。Stack Overflow 和微軟官方文件是最可靠的來源。
延伸閱讀
- 01_專案總覽(.sln與.vcxproj) — 專案結構與各 .cpp 的職責說明
- 01_config.ini設定系統 — Phase 7:修改 ServerIP 和解析度的設定檔說明
- 03_WZ與IMG資源整合原理 — Phase 7:EzorsiaV2_UI.wz 的作用與整合方式
- 01_什麼是記憶體位址與指標 — Phase 3:了解登入器如何在記憶體層面修改遊戲