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

179

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

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

搜索引擎的结果不多,但似乎表明这与Delphi无关,其他应用程序也会出现这种问题。它似乎是由于从64位应用程序调用32位DLL或反之而引起的。

  • 两台PC都是Windows 7,64位
  • 两台PC都安装有只能处理32位的Delphi Xe2入门版
  • 该应用程序在我的PC上运行良好,但在我的朋友的PC上无法运行
  • 其他Delphi应用程序在两台PC上都可以正常运行

有谁能给我一些提示如何追踪这个问题?


7
顺便提一下,你可以使用com0com在单台电脑上安装虚拟串口。这对于调试和测试非常有用,只需创建2个虚拟端口并在配置中将它们连接起来,然后在每个端口上运行您的应用程序,以便它们可以相互通信。 - Remy Lebeau
1
你有检查Windows事件日志吗?有时候Windows会提供更多关于哪个DLL导致应用程序失败的信息。 - Luis Carrasco
1
我猜测这将是一个缺失的 DLL,通常是一些实用程序,甚至是内存管理器。 - mj2008
4
缺少 DLL 会导致不同的错误: 该程序无法启动,因为您的计算机缺少 XXXX.dll。尝试重新安装该程序以解决此问题。 - David Heffernan
4
这个错误是“STATUS_INVALID_IMAGE_FORMAT”。当系统找不到DLL时,你不会遇到这种情况。当可以找到一个DLL文件,但它已损坏或位数不正确时,就会出现“STATUS_INVALID_IMAGE_FORMAT”错误。请注意,此处不涉及解释性内容。 - David Heffernan
显示剩余2条评论
20个回答

146

通常情况下,如果发生以下情况之一:

  • 32位应用程序尝试加载64位DLL。
  • 或者64位应用程序尝试加载32位DLL。
  • 或者64位应用程序尝试在32位Windows上运行。

我们会得到0xC000007B错误代码(表示STATUS_INVALID_IMAGE_FORMAT)。

为了确切知道问题出在哪里,建议使用Dependency Walker测试您的应用程序和其依赖项之间是否存在问题。

请注意,您只需要使用该工具打开您的应用程序,问题将显示为屏幕底部的红色日志条目。

至少在撰写本文时(即2022年),是这样的。

此外,请确保运行正确版本的Dependency Walker,例如,当打开x64二进制文件时,x86版本将显示不正确的结果。


101
这是一个很好的提示,表明32位的应用程序试图加载64位的动态链接库(DLL)。 - Remy Lebeau
4
事实上,这个错误代码 PDF 文件是一个很好的资源。 - mox
4
+1和答案。谢谢,依赖项查找器解决了问题。我用一个32位版本的DLL替换了64位版本,现在它可以工作了。 - Mawg says reinstate Monica
6
确保您使用正确版本的Dependency Walker。对于x64二进制文件,x86依赖项将显示不正确的结果。 - Andreas Haferburg
显示剩余4条评论

56

无法解析加载时间依赖项。最简单的调试方法是使用Dependency Walker。使用Profile选项获得加载过程的诊断输出,这将确定失败点并应该引导您找到解决方案。

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


3
请注意,您应该运行依赖项查找器的32位版本,并确保所有加载的DLL都是32位的。如果您尝试运行64位版本的依赖项查找器,它将愉快地加载64位DLL,例如VCRedist,即使您也有它们的32位版本。 - liorda

13

我尝试了这里列出的所有方法,但最终找到了另一个答案。我必须使用32位的DLL编译我的应用程序。我已经构建了32位和64位库,但我的PATH设置为64位库。在我重新编译我的应用程序后(同时进行了一些代码更改),我遇到了这个可怕的错误,并与之斗争了两天。最终,在尝试了许多其他方法后,我将我的PATH更改为在64位DLL之前具有32位DLL(它们具有相同的名称)。然后它就可以了。我只是添加这个内容以保证完整性。


12

这是一个缺失的dll文件。可能是因为你的与com端口相关的dll文件有未解决的dll依赖问题。你可以使用Dependency Walker和Windows调试器来检查所有的MFC库,例如。此外,你也可以使用nrCommlib来处理与com端口有关的组件。


9
在之前的答案中已经提到使用Dependency Walker是解决问题的方法,但在我的情况下(我的应用程序一直失败并显示错误代码),Dependency Walker显示了几个不相关的dll!最终我发现可以通过进入“profile”菜单来运行性能分析,它会运行应用程序并停在导致问题的确切dll处!我发现一个32位的dll被选中是因为路径问题,并进行了修复。 enter image description here

6

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

如果您使用Visual Studio开发应用程序,则必须确保新计算机(即未开发软件的计算机)安装了适当的Microsoft Visual C++ Redistributable Package。适当的版本包括正确的年份和位数版本(即32位的x86和64位的x64)的Visual C++ Redistributable Package。

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

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

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

以下是我出现此错误并解决它的方法:

1)我在我的电脑ComputerA上使用Visual Studio 2012开发了一个32位应用程序。

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

3) 在电脑B上,我运行了.exe文件,但是出现了错误信息。

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

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

6) 在电脑B上,我运行了.exe文件,没有收到错误信息。


5

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

事实证明,所有出现错误的机器都在运行Win7 x64,并且从未更新过。

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


3
实际上,这个错误提示是指无效的图像格式。但是,为什么会发生这种情况,错误代码通常表示什么呢?实际上,当您尝试运行一个专为或旨在与64位Windows操作系统一起工作的程序,但您的计算机正在运行32位操作系统时,就会出现此问题。
可能的原因:
- Microsoft Visual C++ - 需要重新启动 - DirectX - .NET Framework - 需要重新安装 - 需要以管理员身份运行应用程序
来源:http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/

2
如果您想要表明您的应用程序依赖于Microsoft.Windows.Common-Controls程序集,则可以使用此内容。当您想要加载通用控件库的版本6以应用视觉样式到通用控件时,就需要这么做。
您可能是根据Windows XP时代的微软原始文档进行操作,并将以下内容添加到应用程序的清单中:
<!-- 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更新了他们的文档;现在是您更新清单的时候了:

<!-- 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)写下了一个有关公共控件的精彩历史:


4
"Windows XP不再是操作系统"让我开心:D - Victoria
但是我在'12年就问过这个问题了 - 当时Windows应用程序是否有清单? - Mawg says reinstate Monica
1
@Mawg 这可能与您的问题有关,也可能不相关。但是,由于Stackoverflow结合了维基和Reddit的知识,对于您所报告的确切错误而言,这是一个很好的小提示。话虽如此,从Windows 2000开始,Windows应用程序就拥有汇编清单;从Windows XP开始,除非您的汇编清单声明了对其的依赖性,否则您将无法获得最新版本的comctl32.dll。 - Ian Boyd

2

这可能是一个调试调试器的情况,可以帮助解决问题。基本上,如果您按照这里的说明操作,您可以运行两个IDE,其中一个将调试另一个。如果您在其中一个中运行应用程序,则有时可以捕获您否则会错过的错误。值得一试。


2
这几乎肯定是加载器报告的错误,因此发生在进程启动之前。因此,调试不是一个选项。当然,我的诊断可能是错误的,即错误是由加载器引发的。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接