一个64位的EXE文件能够链接32位的DLL文件吗?

12

我问这个问题是因为我注意到许多64位的EXE文件链接到了看起来像是32位DLL的库。

例如,我的64位MFC应用程序链接到了user32.dll,urlmon.dll,wininet.dll等三个32位DLL,它们都存在于windows\system32中。

那么这是一些适用于这些DLL的微软特有魔法,还是对于需要使用旧的32位DLL的64位EXE来说,存在向后兼容性呢?


我认为我们都已经准备好使用Dependency Walker的下一个版本了。它在处理64位可执行文件时有时会有误导性,并显示一些其他令人讨厌的警告。虽然这些不是真正的错误,但肯定可以更好地呈现。我认为这些问题对于新版本来说是个加分项。 - Eran
@Eran,我下载了最新的64位依赖项,并且显示依赖的DLL文件也是64位的。 - Assaf Lavie
实际上有一些巫术 - 在Win64上,64位ntdll.dll会加载到所有进程中,包括32位和64位。但是你提到的任何DLL都没有什么魔法。 - Ben Voigt
https://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/ - Gabriel
3个回答

24

64位的可执行文件不能连接到32位的DLL库,反之亦然。在64位的Windows操作系统中,Windows\System32目录下的DLL库实际上是64位的DLL库。32位的DLL库则位于Windows\SysWow64目录下。


6
如果“depends”是一个32位程序,那么ssg的评论就会发挥作用——WOW层会重定向32位应用程序对文件系统的视图,以便它们将SysWow64中的内容视为在System32中。 - Curt Hagenlocher
哇,我一直以为是另一种方式。有趣。 - thebunnyrules

13

1
这是一种有用的技术,实际上应该在两个方向上都能工作,但它并不真正是“链接”。 - Curt Hagenlocher
1
为了更加准确(并避免失望),这并不是真正的“从64位调用32位”,文章中描述的“解决方案”只是创建了一个代理32位进程,并使用IPC从64位进程中转发调用。据我所知,在用户模式下直接“从64位调用32位”是不可能的。 - rustyx

2

最新版本的依赖项检查器(在此处找到:http://www.dependencywalker.com/)已解决了此问题。它可以找到正确的DLL文件,并避免错误提示不准确的情况。

(虽然我来晚了,但当我遇到类似问题时,谷歌仍然能找到这个问题。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接