64 位 属性 工作表正在使用 32 位 winapi dll

64bit property sheets are using 32bit winapi dlls

我用 vs2015 转换了一个旧的 visual studio 项目并添加了 64 位平台配置。

我想知道为什么 linker 属性确实包含 32 位库(例如 kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib).

首先我认为这是我的错误,因为我选择从 win32 平台设置中复制设置,但后来我看到这个设置是由 属性 sheet 导入的工作室插入:"Microsoft.Cpp.x64.user"

这真的应该是这样吗?我在某处读到(这里是 SO:Can a 64 bit EXE link against 32-bit DLLs?),64 位应用程序不能 link 针对 32 位 dll。

谁能赐教吗?

这些 DLL 名称可以追溯到 23 年前第一个 32 位版本 Windows 发布时。 Windows 版本 1 到 3 是 16 位并使用 kernel.dll、user.dll 等。他们在 DLL 名称后面粘上“32”,以区别于 16 位版本,并确保 32 位进程不会意外加载 16 位 DLL。

他们在发布 Windows 的 64 位版本时没有再这样做。那时有太多程序对这些名称进行了硬编码,通常是在 LoadLibrary() 调用中,更改名称会使将此类程序移植到 64 位变得非常困难。连存放那些DLL的目录都没有改名,还是"system32"。

所以一台机器现在有两份kernel32.dll等,64位版本位于c:\windows\system32,32位版本位于c:\windows\syswow64 . 32 位进程从不尝试加载 64 位 DLL 仍然非常重要,反之亦然,就像 23 年前一样重要。所以他们想出了另一个技巧,File System Redirector 确保 32 位进程只能看到 syswow64 中的副本。

请注意在名为 "system32" 的目录中有 64 位 DLL 而在 "syswow64" 中有 32 位 DLL 的奇怪之处。一开始让很多程序员感到困惑,现在你知道这是怎么回事了。

与.lib 文件大致相同,SDK 目录有一个x86 和一个x64 目录来存储这些文件。也几乎是自动的,链接器查找 .lib 文件的位置是在项目 > 属性 > VC++ 目录 > 库目录中配置的。 Win32/x86 平台目标使用 $(WindowsSDK_LibraryPath_x86) 而 x64 目标使用 $(WindowsSDK_LibraryPath_x64)。