【问题标题】:Why can't a 64-bit process use 32-bit dlls?为什么 64 位进程不能使用 32 位 dll?
【发布时间】:2026-01-11 22:55:03
【问题描述】:

在这篇文章中,我将讨论使用 C++ 和 Win32 API 创建的原生 Windows 应用程序和 DLL。

Can I load a 32 bit DLL into a 64 bit process on Windows? 的帖子中,我了解到 64 位进程不能直接使用 32 位 DLL。解决此问题的一种方法是将 DLL 托管在 32 位进程中并使用某种形式的 IPC。 既然如此,这背后的原因是什么? 为什么 64 位进程不能使用 32 位 DLL? 难道是x86和x64指令集的区别?

【问题讨论】:

  • 问题好像不是重复的; “重复”问题中的任何答案都没有为这个问题提供答案:“重复”问题询问是否有可能(答案说“否”),而这个问题是关于原因的! @John:请再次提出您的问题;您的问题应该包含对另一个问题的引用(例如“问题的答案'我可以加载 32 位 DLL...' 说这是不可能的。这是什么原因?”)所以每个人都可以看到你的问题不完全一样。
  • @Ben Voigt 您建议的帖子没有回答我的问题。我的问题是为什么 64 位进程不能使用 32 位 dll?
  • 好吧,我强调欺骗的评论似乎已经消失了。但是对于其他问题的答案也肯定会回答这个问题。具体来说,点击link to the Raymond Chen blog post阅读。

标签: windows winapi dll 32bit-64bit


【解决方案1】:

如果传递给 32 位代码的地址有任何位高于设置的第 32 位,它将由于指针大小不匹配而丢失,并且很可能会导致 AV。

【讨论】:

  • 64 位进程仅限于 32 位地址值,除非模块中另有标记。所以这可以得到缓解。