32 位应用程序无法在 x64 Win2003 上运行,原因是

Posted

技术标签:

【中文标题】32 位应用程序无法在 x64 Win2003 上运行,原因是【英文标题】:32 bit application failed to run on x64 Win2003 due to 【发布时间】: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。 【参考方案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 内的嵌入式清单中定义。尝试查看清单(如此处所述***.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 没有注册。它们只是被复制到该位置。它们不是通过任何安装程序安装的。

以上是关于32 位应用程序无法在 x64 Win2003 上运行,原因是的主要内容,如果未能解决你的问题,请参考以下文章

vs2010中配置管理器win32和x64的区别

x64 Windows Server 2003 上的远程调试

VS创建Win32应用选项

win7 X64系统上 PL/SQL不能识别Oracle实例

关于C#编写x86与x64程序的分析

NUnit 不能在 Visual Studio 2003 中的 Vista x64 上运行