如何將32位元的DLL安裝到64位元的Windows中
我之前有个专案因为有用到一个 PKI 元件,该元件是用 C++ 开发的 DLL 元件,但当改安装到 64 位元的Windows Server 2008 上就不能用了。直到最近终於在无意间发现一个 Windows Server 2008 64 位元版的一个 "秘密",可以解决这种 32bit DLL 不相容於 64bit 环境的问题。
我几个星期前在 64bit 的 Windows Server 2008 作业系统,一如往常的安装 DLL 元件,步骤如下:
将 DLL 组件先复制到 C:/Windows/System32 目录下
然後进入命令提示字元执行 regsvr32 xxxxxx.dll 指令
安装时就会出现如下图的错误讯息:
我当时 "直觉" 的认为此 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 (惊讶) 的感觉!
其实 WOW64 是 Windows-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 等。
实际的运作架构如下: