【发布时间】:2018-05-29 12:12:14
【问题描述】:
我发现 32 位 Win32 控制台应用程序正在运行 Windows Server 2012 R2 Standard 的一台特定机器上加载 64 位版本的 kernel32.dll。
使用Dependency Walker 和一个简单的HelloWorld 应用程序,它看起来像这样:
它可以在其他机器上正确加载 32 位 kernel32。
PATH 的值似乎不完全相同,因此至少包括在不同机器上以完全相同的顺序排列的相关路径。
根据微软的this page,DLL 的搜索顺序是:
- 当前进程的可执行模块所在目录。
- 当前目录。
- Windows 系统目录。
GetSystemDirectory函数检索此目录的路径。 - Windows 目录。
GetWindowsDirectory函数检索此目录的路径。 -
PATH环境变量中列出的目录。
我猜在这台特定的机器上GetSystemDirectory 返回到Windows/system32 的路径而不是Windows/SysWOW64 或者从system32 到SysWOW64 的32 位进程的映射不能正常工作,但这些是只有合格的猜测。
知道是什么导致了这种行为吗?
【问题讨论】:
-
这只是 Dependency Walker 的错误——仅此而已。和 32 位应用程序永远不会通过静态导入加载 64 位版本的 kernel32.dll。和路径/ GetSystemDirectory - 这里根本不相关,因为总是存在
\KnownDlls32\kernel32.dll部分。它会被使用 -
Dependency Walker 上一次可靠地工作是在 Windows Vista 上。准备好在从 Windows 7 开始的任何操作系统上看到 Dependency Walker 中令人困惑/误导的信息。诊断 DLL 问题的更好方法是enable loader snaps。
标签: windows winapi dll 32bit-64bit