应用程序无法正确启动 (0xc000007b)

Posted

技术标签:

【中文标题】应用程序无法正确启动 (0xc000007b)【英文标题】:The application was unable to start correctly (0xc000007b) 【发布时间】:2012-05-16 13:09:57 【问题描述】:

我有一个客户端/服务器应用程序,我一直在单台 PC 上开发它。现在它需要两个串口,所以我向朋友借了一台电脑。

当我构建我的应用程序并尝试运行或调试它(无论是在 Delphi IDE 中还是从 Windows 文件管理器中)时,它会出错“”。

谷歌搜索并没有带来太多,但似乎表明这不是 Delphi 特有的,并且在其他应用程序中也会发生。这似乎是由 64 位应用程序调用 32 位 DLL 引起的,反之亦然。

两台电脑都是 Windows 7,64 位 两者都有只能处理 32 位的 Delphi Xe2 入门版 该应用在我的电脑上运行良好,但在我朋友的电脑上却不行 其他 Delphi 应用程序在两台 PC 上都能正常运行

谁能告诉我如何追踪这个问题?

【问题讨论】:

附带说明,您可以使用com0com 在单台PC 上安装虚拟串行端口。非常适合调试和测试,只需创建 2 个虚拟端口并在配置中将它们链接在一起,然后在每个端口上运行您的应用程序,以便它们可以相互通信。 您检查过 Windows 事件日志吗?有时,Windows 会提供有关哪个 DLL 导致应用程序失败的更多信息。 我怀疑它会丢失一个 DLL,通常是一些实用程序,甚至是内存管理器。 @mj2008 Missing DLL 给出不同的错误:程序无法启动,因为您的计算机中缺少 XXXX.dll。尝试重新安装程序以解决此问题。 @snd 这个错误是STATUS_INVALID_IMAGE_FORMAT。当系统找不到该名称的 DLL 时,您不会明白这一点。当可以找到 DLL,但它已损坏或位数错误时,您会收到 STATUS_INVALID_IMAGE_FORMAT 【参考方案1】:

我在从我的存储库中获取代码并在新机器上编译时遇到了这个问题。复制整个存储库,然后编译产生一个可以工作的可执行文件。结果是一个 32 位 DLL 意外没有被签入。正如上面所说的,使用“Dependency Walker”来找出问题所在。

为了更清楚要查找的内容,请参见下面的屏幕截图,在后台,exe 尝试加载错误的 DLL(注意“64”)导致“应用程序无法正确启动 0xc00007b”并在简单复制过来的 exe 的前台(包括正确的 DLL)。

【讨论】:

【参考方案2】:

当然,主要问题是 DLL 文件丢失,或者更可能是损坏。如果是这种情况,那么我有一些不错的想法(尤其是如果您已经手动下载并安装了 DLL!)...

TLDR:删除您已完成的每个手动复制/粘贴的 DLL,卸载旧的可再发行组件,并为两者重新安装新的可再发行组件 32 -bit 和 64 位安装。

做什么

这种将丢失的 DLL 复制/粘贴到 system32 等的解决方案在我记得 1990 年代曾经有效,但它似乎不再有效(2020 年)。所以如果你最近遇到这个问题,我建议:

windows\system32windows\SysWOW64 内,删除与ms*.dll 匹配的所有文件,操作系统将允许您以管理员身份删除。 卸载 Windows 中的所有 Visual C++ Redistributables。这可以防止“你已经有了这个!”重新安装时出现的对话框,在我们重新安装时的下一步中详细说明。 从定期可用的下载站点重新安装 2015-2019 Visual C++ Redistributable。如果这不起作用,请下载并安装其他的,但就个人而言,2015-2019 涵盖了我的一切。 无论您的机器如何,安装 x32 和 x64 软件包!(所有下载链接:Collected VC++ Download Links;MSVCR120.dll Fix;MFC140U.dll Fix。)

您如何知道它的工作原理

遇到这种情况的编码人员有很多变化,因此,通常会放弃只有一个可能的解决方案的想法,但让我们保持积极态度!

如果删除匹配的ms*.dll 文件有效,那么您将不再收到有关error code 0xc000007b 的错误。相反,您会收到一条关于缺少.dll 的消息。这告诉您您选择了正确的代码路径! 如果安装可再发行作品,那么某些流行的DLL文件应该出现在上述system32SysWO64文件夹中。例如:MSVCR120.dllMSVCR140.dllMSVCR100.dllMSVCP100.dllMSVCP120.dllMSVCP140.dll 和朋友。

最后,可能的最佳机会

有时事情并没有按计划进行(正如我们在 Windows 世界中都知道的那样)。您也可以尝试以下方法!

在 Windows 中打开“打开或关闭 Windows 功能”选项卡(在 Windows 8-10 中受支持)。取消选中 .NET Framework 安装。您会看到一个小型安装。 重新启动系统。再次进入上述功能,重新勾选.NET Framework,点击“okay”。如果这可行,您将看到“安装和更新 .NET 框架”消息,这可能需要一分钟左右的时间。完成后,我建议重新启动。

祝你好运!

【讨论】:

【参考方案3】:

您的系统上可能有多个版本的 dll。您可以搜索您的系统以找出答案。只需更改路径中目录的顺序即可解决此问题。这是我的问题。 (Cannot run Qt Creator GUI outside of Qt. "The application was unable to start correctly (0xc000007b)" error)

【讨论】:

【参考方案4】:

如果您试图证明您的应用程序依赖于 Microsoft.Windows.Common-Controls 程序集,则可以使用此功能。当您想要加载第 6 版的通用控件库时,您可以执行此操作 - 以便将视觉样式应用于通用控件。

您可能从 Windows XP 时代就开始遵循 Microsoft 的原始文档,并将以下内容添加到您的应用程序清单中:

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Windows XP 不再是操作系统,您也不再是 32 位应用程序。其间的17年Microsoft updated their documentation;现在是时候更新清单了:

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Raymond Chen 在 Common Controls 方面有着美好的历史:

The history of the Windows XP common controls (archive)

【讨论】:

“Windows XP 不再是操作系统” 成就了我的一天:D 但我在 12 年问过这个问题 - Windows 应用程序甚至有清单吗? @Mawg 这可能与您的问题有关,也可能无关。但是 *** 结合了 wiki 和 reddit 的知识;了解您报告的确切错误是一个很好的花絮。话虽如此,Windows 应用程序的程序集清单可以追溯到 Windows 2000。从 Windows XP 开始,除非您的程序集清单声明对它的依赖,否则您将不再获得最新版本的 comctl32.dll。【参考方案5】:

如果出于某种原因从 x64 机器加载 x86 资源,就会发生这种情况。为了显式避免这种情况,请将此预处理器指令添加到 stdafx.h(当然,在我的示例中,有问题的资源是 Windows Common Controls DLL。

#if defined(_WIN64)
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'\"")
#endif

【讨论】:

常用控件是操作系统的一部分。操作系统知道从哪里加载正确的版本。这无助于解决 OP 的问题。它甚至不安装依赖项。它所做的只是将清单资源编译到应用程序中以使用版本 6 的通用控件。也不需要预处理器条件。只需设置processorArchitecture='*',就可以了。【参考方案6】:

我刚刚遇到了这个问题。我在 Windows 10 控制面板的“应用程序和功能”下搜索“C++”,发现几天前刚刚运行了某种更新并安装了 VC++ Redistributable 2012-2017。运行到错误消息的应用程序只需要 VC++ 2010。我卸载了所有这些,然后重新安装了 2010 x86/x64,错误消失了,应用程序按预期运行。

【讨论】:

【参考方案7】:

在我的情况下,当我在构建 DLL(使用 Visual Studio 2015)后重命名 DLL 时发生错误,以便它符合依赖于 DLL 的可执行文件所期望的名称。重命名后Dependency Walker显示的导出符号列表为空,并显示上述错误消息“应用程序无法正确启动”。

因此可以通过更改 Visual Studio 链接器选项中的输出文件名来修复它。

【讨论】:

【参考方案8】:

在前面的答案中已经提到,使用dependency walker 是可行的方法,在我的情况下(我的应用程序不断失败并显示错误代码),dependency walker 显示了一些不相关的dll!

最后发现我可以通过转到“配置文件”菜单来运行分析,它将运行应用程序并停止在导致问题的确切 dll 处!我发现一个 32 位的 dll 因为路径而被选中并修复它。

【讨论】:

【参考方案9】:

我在使用 Microsoft Visual Studio 2012 开发客户端-服务器应用程序时遇到了同样的问题。

如果您使用 Visual Studio 开发应用程序,则必须确保新的(即未开发该软件的计算机)具有适当的 Microsoft Visual C++ Redistributable Package。适当地,您需要 Visual C++ Redistributable Package 的正确年份和位版本(即 x86 用于 32 位,x64 用于 64 位)。

Visual C++ Redistributable Packages 安装运行时组件,这些组件是运行使用 Visual Studio 构建的 C++ 应用程序所必需的。

这是Visual C++ Redistributable for Visual Studio 2015 的链接。

您可以通过转到控制面板 -> 程序 -> 程序和功能来查看安装的版本。

这是我得到这个错误并修复它的方法:

1) 我在计算机上使用 Visual Studio 2012 开发了一个 32 位应用程序。 我们将我的计算机称为 ComputerA。

2) 我将 .exe 和相关文件安装在另一台我们称为 ComputerB 的计算机上。

3) 在 ComputerB 上,我运行 .exe 并收到错误消息。

4) 在 ComputerB 上,我查看了程序和功能,但没有看到 Visual C++ 2012 Redistributable (x64)。

5) 在 ComputerB 上,我搜索了 Visual C++ 2012 Redistributable 并选择并安装了 x64 版本。

6) 在 ComputerB 上,我在 ComputerB 上运行 .exe,但没有收到错误消息。

【讨论】:

【参考方案10】:

实际上此错误表明图像格式无效。但是,为什么会发生这种情况以及错误代码通常意味着什么?实际上,当您尝试运行为或打算与 64 位 Windows 操作系统一起使用的程序时,可能会出现这种情况,但您的计算机正在 32 位操作系统上运行。

可能的原因:

Microsoft Visual C++ 需要重启 DirectX .NET 框架 需要重新安装 需要以管理员身份运行应用程序

来源:http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/

【讨论】:

【参考方案11】:

还将“依赖项”下载并解压缩到放置 wget.exe 的同一文件夹中

http://gnuwin32.sourceforge.net/packages/wget.htm

然后,您将在同一文件夹中拥有一些 lib*.dll 文件以及 wget.exe,它应该可以正常工作。

(我也在这里回答了我最初找到的https://superuser.com/a/873531/146668。)

【讨论】:

【参考方案12】:

我尝试了此处指定的所有内容,并找到了另一个答案。我必须用 32 位 DLL 编译我的应用程序。我已经构建了 32 位和 64 位的库,但我的 PATH 设置为 64 位库。在我重新编译了我的应用程序(我的代码也进行了一些更改)之后,我遇到了这个可怕的错误并苦苦挣扎了两天。最后,在尝试了许多其他事情之后,我将PATH 更改为在 64 位 DLL 之前拥有 32 位 DLL(它们具有相同的名称)。它奏效了。为了完整起见,我只是在此处添加它。

【讨论】:

【参考方案13】:

刚刚为我的个人项目解决了这个问题(感谢 Dries)。对我来说,这是因为项目路径太长了。将 .sln 保存到较短的路径 (C:/MyProjects) 并从那里编译后,它运行时没有错误。

【讨论】:

@jojodmo:实际上,“对我来说这是因为项目路径太长”在我看来是对寻找错误的有效贡献......【参考方案14】:

我看到在未安装 Visual C++ 的机器上尝试运行 VC++ 调试可执行文件时出现错误。构建发布版本并使用它修复它。

【讨论】:

【参考方案15】:

我最近遇到了一个问题,我正在开发一个应用程序(使用串行端口),它在我测试过的所有机器上都可以运行,但有几个人遇到了这个错误。

事实证明,发生错误的所有机器都运行 Win7 x64 并且从未更新过一次。

在我的特殊情况下,运行 Windows 更新修复了所有机器。

【讨论】:

【参考方案16】:

这是一个缺失的 dll。 可能,与 com 端口一起使用的 dll 具有未解决的 dll 依赖性。 您可以使用依赖walker 和windows 调试器。例如,检查所有 mfc 库。此外,您还可以使用 nrCommlib - 它是使用 com 端口的绝佳组件。

【讨论】:

【参考方案17】:

无法解决加载时间依赖性。最简单的调试方法是使用Dependency Walker。使用 Profile 选项获取加载过程的诊断输出。这将识别故障点并指导您找到解决方案。

此错误的最常见原因是尝试将 64 位 DLL 加载到 32 位进程中,反之亦然。

【讨论】:

+1。另请注意,您应该运行 32 位版本的依赖遍历器,并确保所有加载的 DLL 都是 32 位的。如果您尝试运行 64 位版本依赖漫游器,它会愉快地加载 64 位 DLL,例如 VCRedist,即使您也有 32 位版本。【参考方案18】:

这可能是调试调试器可能有用的情况。本质上,如果您遵循instructions here,您可以运行两个 ide,一个将调试到另一个。如果您将您的应用程序合二为一,您有时会发现您错过的错误。值得一试。

【讨论】:

这几乎可以肯定是加载程序报告的错误,因此发生在进程开始之前。因此,调试将不是一种选择。当然,我的诊断可能是错误的,错误是由加载程序引发的。【参考方案19】:

首先,我建议使用dependency walker 测试您的应用程序及其依赖项之间是否存在问题

【讨论】:

基于 Windows 错误代码 (google.de/…),此错误代码表示:0xC000007B STATUS_INVALID_IMAGE_FORMAT。 这很好地表明 32 位应用程序尝试加载 64 位 DLL。 事实上,这个错误代码PDF文件是一个很好的来源。 +1 和 aswer。谢谢,依赖步行者挽救了这一天。我用 32 位版本替换了 64 位 DLL,它现在可以工作了。 确保您获得了正确版本的 Dependency Walker。对于 x64 二进制文件,x86 依赖项将显示不正确的结果。

以上是关于应用程序无法正确启动 (0xc000007b)的主要内容,如果未能解决你的问题,请参考以下文章

“应用程序无法正确启动(0xc000007b)。单击确定关闭应用程序。”

sdl_net应用程序无法正确启动(0xc000007b)[重复]

vmware应用程序无法正常启动0xc000007b

安装mysql时出现应用程序无法正常启动(0xc000007b)

应用程序无法正常启动0xc000007b

应用程序无法正常启动0xc000007b