2016-04-19 43 views
2

我使用vs2015转换了旧的visual studio项目,并添加了64位平台配置。64bit属性表使用32bit winapi dlls

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

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

这是真的这应该如何工作?我读了一个地方(这里SO:Can a 64 bit EXE link against 32-bit DLLs?),一个64位应用程序无法链接到32位DLL。

somone能启发我吗?

回答

4

这些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目录来存储这些文件。在项目>属性> VC++目录>库目录中配置链接器查找.lib文件的几乎自动。 Win32/x86平台目标使用$(WindowsSDK_LibraryPath_x86),而x64目标使用$(WindowsSDK_LibraryPath_x64)。

+0

啊 - 好 - 我明白了。我也被依赖walker(2.1.xx)激怒了,这表明exe是64位的,但是依赖的dll没有。与更新版本(2.2.xxx)相关性也被标记为64位 - 与他们的名字相反(正如你也解释过的) –

相关问题