【问题标题】:64bit property sheets are using 32bit winapi dlls64 位属性表使用 32 位 winapi dll
【发布时间】:2016-04-19 09:04:53
【问题描述】:

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

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

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

这真的是它应该如何工作的方式吗?我在某处(此处为:Can a 64 bit EXE link against 32-bit DLLs?)读到 64 位应用程序无法链接到 32 位 dll。

有人能启发我吗?

【问题讨论】:

    标签: visual-studio-2015 32bit-64bit


    【解决方案1】:

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

    当他们发布 64 位版本的 Windows 时,他们没有再这样做了。到那时,有太多程序硬编码这些名称,通常在 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)。

    【讨论】:

    • 啊-好的-我明白了。我也对依赖walker(2.1.xx)感到恼火,它显示exe是64位但依赖的dll不是。使用更新版本(2.2.xxx),依赖项也被标记为 64 位 - 与它们的名称相反(正如你所解释的)
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 2013-09-26
    • 2022-01-20
    • 2011-08-08
    • 2013-06-08
    • 1970-01-01
    • 2012-05-12
    • 2011-05-12
    相关资源
    最近更新 更多