Skip to Content
Plugin 開發工具鏈:VC6

工具鏈:VC6

本頁於 2026-09 以 Visual C++ 6.0(cl.exe 12.00.8804,綠色免安裝版)驗證,x86 實際編譯並載入 32 位元主程式確認。

這一頁給已經有 Visual C++ 6.0 的人,通常是手上有一份用 VC6 維護了很多年的韌體,想把它包成 Plugin。本教學不提供取得 VC6 的管道,也不講怎麼安裝;假設你的電腦上已經有一份能用的 VC6。 沒有的話請改用 llvm-mingw。

VC6 的限制先講清楚:

  • 只能編 32 位元(x86)。 它沒有 64 位元的後端。你的 Plugin 只能載進 32 位元的主程式, 要給 64 位元主程式用就得另外用別的編譯器再編一份,見架構要對。
  • 只懂 C89。 沒有 // 註解、變數宣告要放在區塊最前面、沒有 <stdint.h>。 PDK 的範例與 sdk/ 標頭檔都刻意照這個標準寫。
  • 不受自動測試守護:這條車道是「盡力支援」,能用但不會每次改版都有人重新驗證。 本頁的驗證就是為了補這件事。

build.bat 怎麼找到它

vc6 車道需要一個資料夾,裡面有 VC98\ 與 Common\(綠色版通常叫 VC6_green 之類)。 依序找:

  1. 環境變數 VCINSTALLDIR,指到那個資料夾。
  2. 常見位置:D:\Program Files\VC6_green、C:\Program Files\VC6_green、D:\VC6、C:\VC6, 以及 Program Files(含 (x86))底下的 Microsoft Visual Studio。

放在別的地方,或想固定下來:在 plugins\hello_ic\ 把 toolchain.local.bat.sample 複製成 toolchain.local.bat,寫入

set "VCINSTALLDIR=C:\tools\VC6_green"

toolchain.local.bat 的設定優先於環境變數:如果 VCINSTALLDIR 是你之前開 Visual Studio Developer Prompt 留下來的,這個檔案仍然贏,不會被偷偷蓋掉。

build.bat 會把 VC98\Bin 與 Common\MSDev98\Bin 都放進這次建置的 PATH。後者不能少: cl.exe 要從那裡載入 MSPDB60.DLL,少了它 cl.exe 會以一個很大的負數結束碼直接死掉 (Windows 的「找不到 DLL」),看起來跟路徑問題毫無關係。這一切 build.bat 已經處理好, 你只要確認資料夾結構對。

建置與驗證

在 plugins\hello_ic\ 的命令提示字元:

build.bat vc6 x86 release

成功時最後一行:

[ OK ] plugin built: plugins\hello_ic.dll (vc6 x86 release)

過程中會看到一則警告,這是正常的:

LINK : warning LNK4068: /MACHINE not specified; defaulting to IX86

編完怎麼載進主程式,見步驟 1。主程式要用 32 位元版 (nexus_tui.exe 的 x86 版本)。VC6 編出來的 DLL 可以載進用別的編譯器編的 32 位元主程式, 邊界是純 C 介面,編譯器不需要相同。

中文註解的陷阱(CP950)

VC6 讀原始碼時是依系統的字碼頁解讀位元組(繁體中文 Windows 是 CP950), 不是 UTF-8。而教學範例檔是 UTF-8。一個中文字在 UTF-8 是三個位元組,用 CP950 讀會 兩個兩個配對而錯位,結果是:如果一個中文字的位元組緊接在 */ 或 " 前面, 那個結束符號會被吃掉,註解或字串沒有關閉,一路吞到下一個 */ 或 " 才停。 更糟的是編譯器指的行號完全不可信。

規則:非 ASCII 位元組不得緊鄰在 */ 或 " 之前。 寫法很簡單,在中間放一個空白或 ASCII 字元:

/* 錯:註解最後一個字是中文,後面直接接結束符號,VC6 可能吃掉它*/ /* 對:最後放個空白或英文字元,結束符號才安全 。 */ static const char *bad = "顯示"; /* 錯:字串以中文結尾 */ static const char *good = "顯示 "; /* 對:中文後面放一個空白 */

(PDK 範例的說明字串乾脆整段用英文,例如指令表裡的 "say hello in the log", 就是為了避開這件事。)

在程式碼庫裡檢查有沒有違反,可以用 grep(Git Bash 或 WSL)掃描:

grep -nP '[\x80-\xFF]("|\*/)' src/*.c src/*.h

零筆輸出就是全部乾淨。 只有要用 VC6 編譯才需要留意這一條;其他編譯器沒有這個問題。

常見問題

Visual C++ 6.0 was not found:build.bat 找不到資料夾。設 VCINSTALLDIR(或寫進 toolchain.local.bat)指到有 VC98\ 的那一層,不是 VC98\ 本身。

cl.exe 結束碼是像 -1073741515 的大負數:找不到 MSPDB60.DLL,也就是 Common\MSDev98\Bin 沒有在資料夾裡或不完整。檢查綠色版是否解壓完整。

vc6 cannot target x64:你下了 build.bat vc6 x64。VC6 沒有 64 位元後端, build.bat 會直接拒絕,不會替你偷偷改成 x86。

編譯訊息的行號指到一個看起來沒問題的地方:懷疑是上面的 CP950 陷阱,用 grep 掃一次。