【问题标题】:Can a 64 bit EXE link against 32-bit DLLs?64 位 EXE 可以链接到 32 位 DLL 吗?
【发布时间】:2009-07-12 15:40:53
【问题描述】:

我问是因为我注意到许多 64 位 EXE 链接到看似 32 位的 DLL。

例如,我的 64 位 MFC 应用程序链接到 user32.dll, urlmon.dll, wininet.dll - 所有这些都是驻留在 windows\system32 中的 32 位 DLL。

那么,这是适用于这些 DLL 的一些特定于 MS 的魔法吗,或者对于需要使用旧版 32 位 DLL 的 64 位 EXE 是否存在向后兼容性?

【问题讨论】:

  • 我认为我们已经为下一个版本的 Dependency Walker 做好了准备。它有时会以一种误导性的方式处理 64 位可执行文件,并显示一些其他令人讨厌的警告。这些并不是真正的错误,但肯定可以更好地呈现。我认为这类问题是对新版本的 +1。
  • @Eran,我下载了 64 位的最新依赖,它显示依赖 DLL 为 64。
  • 实际上有一些魔法——在 Win64 上,64 位 ntdll.dll 被加载到所有进程中,包括 32 位和 64 位。但是你提到的任何 DLL 都没有什么神奇之处。

标签: windows 64-bit dll


【解决方案1】:

您不能将 64 位 EXE 链接到 32 位 DLL,反之亦然。在 64 位 Windows 操作系统上,Windows\System32 中的 DLL 实际上是 64 位 DLL。 32 位版本位于 Windows\SysWow64 中。

【讨论】:

  • 如果“depends”是一个 32 位程序,那么 ssg 的注释就起作用了——WOW 层重定向 32 位应用程序的文件系统视图,以便他们看到 SysWow64 中的内容是在 System32 中。
  • 哇,我一直以为反过来。有趣。
【解决方案2】:

从 64 拨打 32,当然可以。 (在 Windows 中,这称为 WOW,即 Windows 上的 Windows)。但是,反过来也行不通。

这里你有如何解释:

http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/

希望它有用。

【讨论】:

  • 这是一种有用的技术,它实际上应该双向工作,但它并不是真正的“链接反对”。
  • 准确来说(避免失望),并不是真正的“Call 32 from 64”,文章中描述的“解决方案”只是创建了一个代理32位进程,并使用IPC将调用转发到它来自 64 位进程。据我所知,直接“从 64 呼叫 32”是不可能的(在用户模式下)。
【解决方案3】:

最新版本的 Dependency Walker(可在此处找到:http://www.dependencywalker.com/)修复了此问题。它会找到正确的 DLL,并避免不准确的错误。

(我参加聚会迟到了,但是当我遇到类似问题时,谷歌仍然发现了这个问题。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2011-09-11
    • 2020-02-12
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多