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


159

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

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

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

  • 两台PC均为Windows 7、64位
  • 两者都具有只能处理32位的Delphi Xe2入门版
  • 该应用程序可以在我的PC上正常运行,但不能在我朋友的PC上运行
  • 其他Delphi应用程序在两台PC上都可以正常运行

谁能给我一个关于如何追踪的提示?


6
附带说明,您可以使用com0com在单个PC上安装虚拟串行端口。非常适合调试和测试,只需创建2个虚拟端口并在配置中将它们链接在一起,然后在每个端口上运行您的应用程序即可使它们彼此通信。
雷米·勒博

1
您是否检查了Windows事件日志?有时Windows提供有关哪个DLL导致应用程序失败的更多信息。
路易斯·卡拉斯科

1
我怀疑这将是缺少的DLL,通常是一些实用程序,甚至是内存管理器。
mj2008

4
@ mj2008缺少DLL会给出另一个错误:由于您的计算机缺少XXXX.dll,因此无法启动程序。尝试重新安装该程序以解决此问题。
大卫·赫弗南

3
@snd此错误是STATUS_INVALID_IMAGE_FORMAT。当系统找不到该名称的DLL时,您将不会得到该信息。STATUS_INVALID_IMAGE_FORMAT当可以找到一个DLL,但它已损坏或具有错误的位时,您会得到提示。
David Heffernan

Answers:


133

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


31
根据Windows错误代码(google.de/…),此错误代码的含义是:0xC000007B STATUS_INVALID_IMAGE_FORMAT。
mox 2012年

95
这很好地表明32位应用程序试图加载64位DLL。
雷米·勒博

4
实际上,此错误代码Pdf文件是一个很好的来源。
mox 2012年

4
+1并请求。谢谢,依赖性步行者挽救了这一天。我用32位版本替换了64位DLL,现在可以使用了。
Mawg说恢复Monica 2012年

6
确保您获得了正确的Dependency Walker版本。对于x64二进制文件,x86依赖将显示不正确的结果。
Andreas Haferburg

53

加载时间依赖性无法解决。调试此问题的最简单方法是使用Dependency Walker。使用配置文件选项可获取装入过程的诊断输出。这将确定故障点,并应指导您找到解决方案。

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


2
+1。另请注意,您应该运行32位版本的依赖关系遍历,并确保所有加载的DLL都是32位。如果您尝试运行64位版本的依赖项Walker,即使您也拥有其32位版本,它将很乐意加载64位DLL,例如VCRedist。
liorda

12

这是一个丢失的dll。可能是,与com端口一起使用的dll具有无法解析的dll依赖性。您可以使用依赖项遍历器和Windows调试器。例如,检查所有的mfc库。另外,您可以使用nrCommlib-它是使用COM端口的出色组件。


12

我尝试了此处指定的所有操作,然后找到了另一个答案。我必须使用32位DLL编译应用程序。我已经建立了32位和64 PATH位库,但是将我的库设置为64位。重新编译我的应用程序后(代码中也进行了许多更改),我遇到了这个可怕的错误,并费了两天的时间。最后,在尝试了许多其他操作之后,我更改了PATH在32位DLL之前的64位DLL的名称(它们具有相同的名称)。而且有效。我只是为了完整性在这里添加它。


9

在较早的答案中已经提到,使用依赖项遍历是必经之路,就我而言(我的应用程序不断出现错误代码),依赖项遍历显示了一些不相关的dll!

最终发现我可以通过进入“配置文件”菜单来运行配置文件,它将运行该应用程序并在导致问题的确切dll处停止!我发现由于路径问题而选择了32位dll,并对其进行了修复。

在此处输入图片说明


5

最近,我在开发一个应用程序(使用串行端口)时遇到了一个问题,该应用程序可以在我对其进行测试的所有计算机上正常工作,但是有些人却遇到了此错误。

原来,所有发生此错误的计算机都在运行Win7 x64,并且从未更新过。

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


5

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

如果使用Visual Studio开发该应用程序,则必须确保新的(即未在其上开发软件的计算机)具有适当的Microsoft Visual C ++可再发行组件包。在适当的情况下,您需要正确的年份和位版本(即x86(用于32位)和x64(用于64位))。

Visual C ++可再发行组件程序包安装运行使用Visual Studio生成的C ++应用程序所需的运行时组件。

这是指向Visual Studio 2015Visual C ++可再发行组件的链接。

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

这是我如何得到此错误并修复的方法:

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,但未收到错误消息。


3

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

可能的原因:

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

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


2

这可能是调试调试器可能有用的情况。本质上,如果您按照此处说明进行操作,则可以运行两个ide,一个可以调试到另一个。如果您将应用程序合并为一个,有时可能会捕获到您否则会错过的错误。这值得一试。


2
几乎可以肯定,这是加载程序报告的错误,因此会在进程开始之前发生。因此,调试将不是一种选择。当然,我的诊断可能是错误的,因为错误是由加载程序引起的。
David Heffernan

2

我已经看到尝试在未安装Visual C ++的计算机上运行VC ++调试可执行文件的错误。构建发行版本并使用该版本进行修复。


2

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

因此,可以通过在Visual Studio链接器选项中更改输出文件名来解决此问题。


2

如果您试图向应用程序表明它依赖于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年中,微软更新了他们的文档 ; 现在是时候更新清单了:

<!-- 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)在通用控件方面有着悠久的历史:


3
“ Windows XP不再是操作系统”让我感动:D
Victoria

但是我在12年前问过这个问题-那时Windows应用程序甚至有清单吗?
Mawg说恢复莫妮卡

1
@Mawg这可能与您的问题无关。但是由于Stackoverflow是Wiki和Reddit知识的结合;了解您报告的确切错误是一个好消息。话虽如此,Windows应用程序的程序集清单可以追溯到Windows 2000。从Windows XP开始,除非您的程序集清单声明了对它的依赖,否则您将不再获得comctl32.dll的最新版本。
伊恩·博伊德

1

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


1
@jojodmo:实际上,“对我来说,这是因为项目路径太长了”对我来说似乎是对错误搜寻的有效贡献……
Christian Severin 2014年


1

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


1

如果出于某种原因从x64机器加载了x86资源,则可能会发生这种情况。为了明确避免这种情况,请将此预处理程序指令添加到stdafx.h中(当然,在我的示例中,有问题的资源是Windows公共控件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

1
通用控件是操作系统的一部分。操作系统知道从何处加载正确的版本。这无法解决OP的问题。它甚至不安装依赖项。它所做的只是将清单资源编译到应用程序中,以使用通用控件的版本6。也不需要预处理器。只需设置processorArchitecture='*',就足够了。
IInspectable '18年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.