【问题标题】:Program Built on Win7 won't run on WinXP在 Win7 上构建的程序无法在 WinXP 上运行
【发布时间】:2011-09-12 19:05:53
【问题描述】:

我有一个项目,我正在使用 Visual Studio 2005 在 Windows 7(32 位)上构建。该程序构建良好,我可以将其移动到另一台 Windows 7 机器上并正常运行。当我尝试将其移至 Windows XP Pro 机器时,问题就出现了。当我尝试运行该文件时,我收到以下错误:

“由于应用程序配置不正确,此应用程序无法启动。重新安装应用程序可能会解决此问题。”

当我打开事件查看器时,出现三个与此问题相关的系统错误:

  • 无法找到依赖程序集 Microsoft.VC80.CRT 并且上次错误是您的系统上未安装引用的程序集。
  • 解决 Microsoft.VC80.CRT 的部分组装失败。引用错误消息:您的系统上未安装引用的程序集。
  • 为 [我的 exe 路径] 生成激活上下文失败。参考错误消息:操作成功完成。

我尝试安装 Visual C++ 2005 SP1 Redistributable Package,但没有帮助。

如果我在 XP 计算机上构建项目,我可以在另一台 XP 计算机(没有 C++ 可再发行组件)和 Windows 7 计算机上运行它。

总是在 XP 上构建不是一个可行的选择,因为我不是唯一构建这个的人,其他人都将使用 Win7。

【问题讨论】:

  • 这是您尝试运行的 Debug 版本还是 Release?
  • 因为您看到这些错误,您的可执行文件有一个嵌入式清单。可以发一下吗?
  • 您的 Win7 机器可能安装了 VS2005 运行时库的最新安全补丁。您需要创建一个安装项目以在目标计算机上安装正确的 DLL。这通常是使用 /MD 编译的程序的要求。
  • 清单的版本号比 XP 的新,如果我将 XP exe 的文件作为 .manifest 文件保存在同一目录中,它可以工作...有没有办法更改版本号显化到下层?

标签: c++ windows-7 visual-studio-2005 windows-xp


【解决方案1】:

如果它是本机二进制文件,请使用 Dependency Walker 检查丢失的系统 DLL - http://www.dependencywalker.com/

还要检查您是否需要 WINVER - http://msdn.microsoft.com/en-us/library/aa383745%28v=vs.85%29.aspx 否则 SDK 会退回到 SDK 版本,对于较新的版本是 Vista+。因此,您可能会不小心调用一些 XP 甚至不可用的函数。

【讨论】:

  • WINVER 宏的值很可能是这里的问题,+1
  • 我在 Win7 和 WinXP .exe 上都使用了 Dependency Walker。他们需要相同的 .dll,但缺少 Win7 的。我使用 ResHack 打开了这两个文件并查看了它们的清单(有人在这里提到了它们,我做了一个快速的谷歌)。除了缺少的 .dll 的版本号之外,它们是相同的。我从 WinXP 版本复制了清单内容,并将其保存在与 Win7 版本相同目录下的 .manifest 文件中,现在它可以运行了。有没有办法让嵌入式清单使用较低的版本号?
  • @MaddHatter :更改清单是在倒退——你应该做的是确保安装了最新的redist,我相信目前是this one .
【解决方案2】:

这就是最终解决问题的方法:

将以下文件夹:"C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT"(因为这是事件查看器中提到的文件)复制到与我执行时遇到问题的 .exe 相同的目录中。这让程序可以使用它所构建的依赖项。

【讨论】:

  • 虽然这可能会解决您的问题,但它并不是处理此问题的最佳方法。在 CRT 的下一次安全更新之后,您可能会遇到同样的情况。最好的解决方案是使用您的设置安装匹配的 CRT 可再发行组件。这样,您的客户也将受益于从 Microsoft 到 CRT 的安全更新。
【解决方案3】:

在将我们的 Visual Studio 版本更新到 Visual Studio 2005 SP1 后,我们遇到了类似的问题。它附带了 MFC 和 CRT 的更新版本。

您可以使用 Dependency Walker (http://www.dependencywalker.com/) 检测问题。

如果看起来是这样,请尝试确保应用了 Windows 更新。 您还可以下载并运行 Visual Studio 2005 SP1 可再发行组件。

Visual Studio 2005 可再发行版 http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=14431

Visual Studio 2005 SP1 可再发行版 http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5638

维维安·德·斯梅特。

【讨论】:

    【解决方案4】:

    程序集是 .NET,而不是本机代码。您可能缺少 .NET 框架。 Visual C++ Redistributable 将不包含 .NET 程序集。

    【讨论】:

    • 为了迷惑程序员,MSFT 还调用强命名的本地 DLL 程序集。在这里阅读:msdn.microsoft.com/en-us/library/ms235624(v=vs.80).aspx 列出的程序集与 .NET 无关
    • @Pablo :我相信要准确地将本地库标记为“程序集”,它必须附有清单(但我对此并不肯定)。
    【解决方案5】:

    在较新的操作系统或库版本上构建的软件可能会依赖于旧版操作系统或库中不存在的新 API 或功能。

    您可以:

    • 在您打算支持的最旧系统上构建您的软件。这假定系统的较新版本保留了与基本版本的向后兼容性。您的软件将无法利用较新版本操作系统中提供的功能,但应该能够在未来提供的所有向后兼容系统上运行。

    • 为您打算部署它的每个系统构建一次软件。这是更多的工作,但意味着您可以配置您的软件以利用新的 API 和功能,因为它们在平台的各种版本迭代中可用。

    【讨论】:

    • +1 以对抗任何路过的投票者。我恨他们白痴。
    • 可执行文件不依赖于运行编译器的操作系统,而是项目设置和SDK版本。
    • VC80 不是操作系统的一部分
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2011-09-03
    • 1970-01-01
    • 2013-08-06
    • 2016-01-27
    • 2014-09-28
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多