Skip to Content
Plugin 開發架構要對:x86/x64

架構要對:x86/x64

這是最容易做錯、而且錯誤訊息完全沒有指出原因的一件事,請在動手前看完。

主程式有兩個版本:32 位元(x86)與 64 位元(x64)。Plugin DLL 的架構必須跟載入它的 主程式相同。 編譯器、debug 或 release 都不用相同,只有架構要對。

維度必須與主程式相同嗎
架構(x86/x64)必須
編譯器不必:VC6 編的 32 位元 Plugin 能載進 llvm-mingw 編的 32 位元主程式
debug/release不必

錯了會怎樣:Plugin 不在清單裡,唯一的線索是 Log 裡一行 ERROR

架構不符時,Windows 載入 DLL 會失敗,錯誤碼是 ERROR_BAD_EXE_FORMAT(193)。 主程式會在 Log 記下一行 ERROR:

plugin dll skipped: hello_ic.dll could not be loaded (win32 error 193)

問題是這行字沒有說「架構錯了」,只說「載入失敗」;而且它只出現在 Log,畫面上不會跳 任何視窗或提示,Plugin 就是不在清單裡。看到 win32 error 193,意思就是 DLL 與主程式的 架構不同。(缺少相依 DLL 也會出現類似的行,錯誤碼則不同。)

實際做一次給你看:把 64 位元的 hello_ic.dll 放進 32 位元主程式的 plugins\,然後

nexus_tui.exe --batch --dongle mock --cmd "plugin list"
PLUGIN: 0 registered

一顆都沒有。DLL 明明在資料夾裡,Plugin 卻不存在。注意 --batch 只印指令的答案,不印 Log, 所以批次模式下連那行 ERROR 都看不到;在一般(有畫面的)模式下才看得到它。 看到「Plugin 掃不到」時,第一件事是去 Log 找 plugin dll skipped 這一行,其次才是檔名、 資料夾位置、有沒有重新掃描。

兩個都要編

主程式兩種都有人用,所以要讓所有人都能用你的 Plugin,就要編兩次、出貨兩顆 DLL。 build.bat 每次只編一種,而且兩種都寫到同一個檔名 plugins\hello_ic.dll, 所以每編完一次立刻把它搬走:

build.bat clangmingw x64 release mkdir ..\dist-x64 move ..\hello_ic.dll ..\dist-x64\ build.bat clangmingw x86 release mkdir ..\dist-x86 move ..\hello_ic.dll ..\dist-x86\

哪些車道能編哪種架構

車道x86x64
clangmingw(llvm-mingw)可以可以
gcc(w64devkit)不行可以
vs2022(Visual Studio)可以可以
clangcl可以可以
vc6可以不行

不支援的組合 build.bat 會直接拒絕並說明,不會偷偷改成鄰近的架構: 那樣你會拿到與預期不同架構的 DLL,卻一點都不知道。

怎麼檢查一個 DLL(或 exe)是哪種架構

用 PowerShell 讀 PE 標頭裡的「機器型別」,不需要任何額外工具:

$b = [IO.File]::ReadAllBytes("hello_ic.dll") $m = [BitConverter]::ToUInt16($b, [BitConverter]::ToInt32($b, 0x3C) + 4) "{0:X4}" -f $m
印出意思
014C32 位元(x86)
866464 位元(x64)

同一段程式碼對 nexus_tui.exe 也一樣用,先確認你手上的主程式是哪一種,再決定放哪一顆 DLL。

有裝 Visual Studio 的話,在 Developer Command Prompt 用 dumpbin /headers hello_ic.dll, 看 machine 那一行(x86 或 x64)也行。

檢查清單

Plugin 掃不到時,依序看:

  1. 先看 Log:有沒有 plugin dll skipped: <檔名> could not be loaded (win32 error 193)? 有,就是架構不符(193);沒有,才往下查。
  2. DLL 與主程式的架構一樣嗎?(上面的方法)
  3. DLL 在主程式旁的 plugins\ 資料夾嗎?不是 plugins\hello_ic\。
  4. 有重新掃描嗎?程式啟動時掃一次;視窗版可用 ☰ → Plugin → Rescan plugins/ folder,終端機版重新啟動程式。
  5. 檔案有被防毒軟體隔離嗎?