如何編譯第一個 DLL:從原始碼到 dinput8.dll

前置條件

在開始之前,請確認你已經完成 Phase 1 第 4 篇:安裝 Visual Studio,並且已經下載好 MapleEzorsia-v2-main 的原始碼資料夾。


什麼是「編譯」?

用最簡單的說法:編譯就是把你看得懂的程式碼(文字),變成電腦看得懂的機器語言(.dll 檔案)的過程

我們的目標是把 ezorsia/ 資料夾裡的 .cpp 原始碼,透過 Visual Studio 編譯成一個叫做 dinput8.dll 的檔案,再把它放進 MapleStory 遊戲目錄就能生效。


第一步:開啟專案

  1. 用檔案總管找到你下載的原始碼資料夾,進入 MapleEzorsia-v2-main/
  2. 找到 Ezorsia V2.sln 這個檔案(圖示是 Visual Studio 的紫色方塊)。
  3. 雙擊 這個 .sln 檔案,Visual Studio 會自動開啟整個專案。

第一次開啟比較慢

Visual Studio 第一次載入專案時需要建立索引,可能要等 30 秒到 1 分鐘。畫面左下角出現「Ready」才代表載入完成。

  1. 載入完成後,右側的 Solution Explorer(方案總管)應該會出現 ezorsia 這個專案名稱。

截圖建議 1

截哪裡:Solution Explorer 面板,顯示 ezorsia 專案名稱展開的樹狀結構(可以看到 dllmain.cppClient.cpp 等檔案)。若 Solution Explorer 不見了,可以按選單 View → Solution Explorer 叫出來。


第二步:確認編譯設定(這步非常關鍵!)

這是最容易出錯的地方。編譯前必須確認兩個下拉選單的設定都正確。

在 Visual Studio 頂端工具列,找到兩個並排的下拉選單:

下拉選單正確設定錯誤設定
Configuration(組態)ReleaseDebug
Platform(平台)x86x64

平台選錯會讓 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.iniEzorsiaV2_UI.wz 是因為專案設定了自動複製,所以會跟著 dinput8.dll 一起出現在輸出資料夾,不需要你手動複製。

截圖建議 4

截哪裡:用檔案總管開啟 out\Release\ 資料夾,顯示三個檔案的清單(名稱、類型、大小)。dinput8.dll 的大小通常在幾百 KB 左右。


第五步:把 DLL 放到遊戲資料夾

  1. 找到你的 MapleStory 遊戲目錄(通常是 C:\Nexon\MapleStory\ 或你安裝私服時設定的路徑)。
  2. 把以下三個檔案全部複製進去:
    • dinput8.dll
    • config.ini
    • EzorsiaV2_UI.wz

三個檔案要一起複製

dinput8.dll 在啟動時會讀取 config.iniEzorsiaV2_UI.wz,缺少任一個都會導致遊戲閃退或功能失效。

  1. 啟動遊戲,觀察遊戲視窗是否變成 HD 解析度(寬螢幕或更高解析度)。如果有變化,代表 DLL 已經成功被遊戲載入。

覆蓋舊檔案

如果遊戲目錄裡已經有舊版的 dinput8.dll,直接覆蓋即可。不需要先刪掉舊檔。


Debug 版本 vs Release 版本

你可能注意到 Configuration 除了 Release 之外還有 Debug 選項。兩者的差異如下:

比較項目Debug 版本Release 版本
用途開發、測試、找 Bug實際使用
檔案大小較大(含除錯符號)較小(已最佳化)
執行速度較慢較快
輸出位置out\Debug\dinput8.dllout\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 headerstdafx.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.libWs2_32.lib 沒有加入確認 vcxproj 沒有被修改過;最簡單的方法是重新下載原始碼
開啟 .sln 後 Visual Studio 要求「Retarget」Toolset 版本不符(專案需要 v143,即 VS 2022)安裝 Visual Studio 2022,或安裝 v143 Build Tools

找不到你的錯誤?

把 Output 視窗的完整錯誤訊息複製下來,用 Google 搜尋錯誤代碼(例如 LNK1104),通常都能找到解答。Stack Overflow 和微軟官方文件是最可靠的來源。


延伸閱讀