The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何將32位元的DLL安裝到64位元的Windows中 (WoW64)

我之前有個專案因為有用到一個 PKI 元件,該元件是用 C++ 開發的 DLL 元件,但當改安裝到 64 位元的Windows Server 2008 上就不能用了。直到最近終於在無意間發現一個 Windows Server 2008 64 位元版的一個 "秘密",可以解決這種 32bit DLL 不相容於 64bit 環境的問題。

我幾個星期前在 64bit 的 Windows Server 2008 作業系統,一如往常的安裝 DLL 元件,步驟如下:

  1. 將 DLL 組件先複製到 C:\Windows\System32 目錄下
  2. 然後進入命令提示字元執行 regsvr32 xxxxxx.dll 指令

安裝時就會出現如下圖的錯誤訊息:

RegSvr32 無法載入模組 in Windows Server 2008 64bit

我當時 "直覺" 的認為此 DLL 不相容於 64bit 環境,但元件廠商又不提供 64bit 的版本,讓我痛苦不已,因為畢竟 Windows Server 2008 64bit + Office + 一拖拉褲的開發工具與軟體都已經安裝完成,實在不想再重新安裝一遍。

直到最近發現在 Windows Server 2008 64bit 有一個奇特的 C:\Windows\SysWOW64 目錄,只要把 32bit 元件複製到這個目錄就可以正常使用 regsvr32 安裝並使用了

好玩的地方在於他的目錄命名規則,在 64bit 架構下的 Windows Server 2008 這兩個目錄的用途如下:

  • C:\Windows\System32 目錄:放置所有 64bit 的 DLL 元件
  • C:\Windows\SysWOW64 目錄:放置所有 32bit 的 DLL 元件

但為什麼要用 System32 當成 64bit 的預設目錄呢?

而需要與 32bit 相容的目錄為什麼要用 SysWOW64 當目錄名稱呢?還真的有一點 WOW (驚訝) 的感覺!

其實 WOW64Windows-on-Windows 64-bit 的縮寫,而 WOW64 是 Windows 64bit 的一個子系統,主要的目的在於讓 64bit 的 Windows 可以執行 32bit 的應用程式。WOW64 還提供一個簡易的轉換介面(lightweight translation layer) 能讓 32bit 應用程式在完全不用修改的情況下得以在 Windows 64bit 的環境下還能正常執行,其中包括 CPU, Registry, File system, ... 等各種 32bit v.s. 64bit 之間的差異做處理。

這個技術在有支援 64bit 的 Windows 版本中都有支援,像是 Windows XP x64 Edition, Windows Vista, Windows 7, Windows Server 2003, , Windows Server 2008 等。

實際的運作架構如下:

WOW64 運作架構

詳細的技術細節請參考相關連結

相關連結