【问题标题】:32 bit application failed to run on x64 Win2003 due to32 位应用程序无法在 x64 Win2003 上运行,原因是
【发布时间】:2009-05-29 16:29:19
【问题描述】:

这是我的问题:

我开发了一个可以在各种平台上运行的应用程序,包括 Windows 和 Unix。此应用程序在纯 Win32 机器(WinXP)或纯 Win64(Win2K3 x64 版)和其他 unix 平台上运行良好。

只有在 64 位 Win2K3 上以 32 位模式运行时才会失败。此应用程序在运行时调用第三方 dll。并且第三方dll没有正式安装,只是复制到同一环境中的一个位置。我也确定我拥有这些 3rd 方 dll 的正确版本(我的意思是 32 位版本的 32 位模式)。即使我在这个测试框中手动设置了“路径”,它仍然不起作用。该应用程序在此 Win2K3 盒子中以 32 位模式编译和构建。

我运行dependency walker 并看到同样的错误。找不到该第 3 方 dll。

任何人都可以对此有所了解吗?如何使第 3 方 dll 路径对我的应用或系统可见?

【问题讨论】:

  • 在依赖walker中,它无法找到整个dll本身或抱怨某些方法不存在?
  • 它抱怨找不到整个dll。

标签: c++ windows 64-bit 32-bit


【解决方案1】:

我建议您执行以下操作:

  • 确保您使用的是 32 位 带有 32 位应用程序的问题 DLL 版本
  • 使用 filemon 查看您的路径 应用程序在加载时尝试 动态链接库
  • 如果您放置,请检查它是否有效 该 DLL 进入这些路径之一
  • 对那个 DLL 使用依赖遍历器 本身 - 它可能有自己的未解决 依赖关系

【讨论】:

  • 感谢您的建议。我将第 3 方 dll 复制到工作目录。但问题仍然存在。使用dependency walker,看起来第3方dll缺少其依赖项,例如MFC80.dll等。但是,这些丢失的文件确实存在于系统中,但有两个版本,一个用于x86,一个用于x64。它可能会混淆第 3 方 dll。问题,是否可以在 Win2K3 x64 上显式设置路径以运行 32 位应用程序?我设置了“PATH”之类的环境变量,但似乎不起作用。
  • 你的 DLL 是用 vs2005 构建的,它实际上有两个运行时版本——pre-sp1 和 sp1(每个库都有自己的版本,所以同一个库有多个版本)。 DLL 所需的运行时的具体版本应该(很可能)在 DLL 内的嵌入式清单中定义。尝试查看清单(如此处所述stackoverflow.com/questions/420852/…)并查看 System\WinSxS 中是否有相应版本的 Visual Studio DLL。如果没有 - 您需要安装适当的运行时可再发行组件。
  • 感谢您提供此信息。我会试着调查一下。顺便说一句,我们的应用程序是在 64 位 Windows 上使用 VS 2003.Net 构建的,用于 32 位版本,并使用 VS 2005 构建用于 64 位版本。在寻找要加载的正确 dll 方面有什么不同吗?
【解决方案2】:

WOW64 将 32 位应用程序的所有调用重定向到 System32 文件夹到 SysWOW64 文件夹。第三方DLL是否在system32文件夹中?因为与您的预期相反,system32 文件夹在 Windows x64 上仅包含 64 位 DLL。

【讨论】:

  • 我们的第三方 dll 被放置在它自己的文件夹中。但是这些 dll 没有注册。它们只是被复制到该位置。它们不是通过任何安装程序安装的。
猜你喜欢
  • 2010-10-18
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多