Win32 32 位进程加载 64 位 kernel32.dll

mgd*_*mgd 4 windows dll winapi 32bit-64bit

我遇到 32 位 Win32 控制台应用程序正在一台运行 Windows Server 2012 R2 标准的特定机器上加载 64 位版本的 kernel32.dll。

在一个简单的HelloWorld应用程序中使用Dependency Walker,它看起来像这样:

加载 64 位版本的 kernel32.dll

它在其他机器上正确加载 32 位 kernel32。

加载 32 位版本的 kernel32.dll

的值PATH似乎不相同,因此至少在不同的机器上以完全相同的顺序包含相关路径。

根据微软的这个页面,DLL 的搜索顺序是:

  1. 当前进程的可执行模块所在的目录。
  2. 当前目录。
  3. Windows 系统目录。该GetSystemDirectory函数检索此目录的路径。
  4. Windows 目录。该GetWindowsDirectory函数检索此目录的路径。
  5. PATH环境变量中列出的目录。

我猜测在这台特定的机器上GetSystemDirectory返回路径到Windows/system32而不是32 位进程的Windows/SysWOW64system32到的映射SysWOW64不能正常工作,但这些只是合格的猜测。

知道是什么导致了这种行为?