应用程序无法正常启动(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个回答

2

我曾经在一台没有安装Visual C++的机器上尝试运行VC++调试可执行文件时看到了错误。构建一个发布版本并使用它可以解决这个问题。


2
在我的情况下,我在使用Visual Studio 2015编译DLL后将其重命名,以适应依赖该DLL的可执行文件所期望的名称。在重命名后,Dependency Walker显示的导出符号列表为空,并且会显示“应用程序无法正确启动”的错误消息。
因此,可以通过更改Visual Studio链接器选项中的输出文件名来修复此问题。

2
当然,主要问题是缺少一个DLL文件,或者更有可能的是该文件已经损坏。如果是这种情况,我有一些很好的想法(特别是如果您手动下载和安装了一个DLL!)...

简而言之:删除您复制/粘贴过的每个DLL,卸载旧的可再发行安装程序,并重新安装新的32位和64位可再发行安装程序。

该怎么做

在90年代,将缺失的DLL复制/粘贴到system32等位置的解决方案曾经有效,但现在似乎不再有效(2020年)。因此,如果您最近遇到此问题,请尝试以下操作:

  • windows\system32windows\SysWOW64 中,删除所有与 ms*.dll 匹配的文件,只要操作系统允许您以管理员身份删除这些文件。
  • 卸载您在 Windows 上安装的所有 Visual C++ Redistributables。这可以防止在重新安装时出现“您已经拥有此项!”对话框,如下一步中所述。
  • 从常规可用的下载站点重新安装 2015-2019 Visual C++ Redistributable。如果这不起作用,请下载并安装其他版本,但就个人而言,2015-2019 版本已经涵盖了所有内容。无论您的计算机是什么类型,都要安装 x32 和 x64 包!(所有下载链接:Collected VC++ Download LinksMSVCR120.dll FixMFC140U.dll Fix)。
如何知道它正在工作:
对于经历这种情况的编码人员,存在很多变化,因此通常会放弃只有一个可能解决方案的想法,但让我们保持积极!
- 如果删除匹配的ms*.dll文件有效,则您将不再收到关于错误代码0xc000007b的错误消息。相反,您将收到有关缺少.dll文件的消息。这告诉您正在命中正确的代码路径! - 如果安装可再发行组件,则某些流行的DLL文件应出现在上述system32和SysWO64文件夹中。例如:MSVCR120.dll、MSVCR140.dll、MSVCR100.dll、MSVCP100.dll、MSVCP120.dll、MSVCP140.dll等。
最后,可能是最好的机会:
有时事情并不按计划进行(正如我们所有人在Windows世界中所知道的那样)。您也可以尝试以下方法!
将Windows功能打开或关闭选项卡(适用于Windows 8-10)。取消选中.NET Framework安装。会看到一个小的安装过程。
重新启动系统。再次打开上述功能,重新选择.NET Framework,并单击“确定”。如果成功,将会看到一个“正在安装和更新.NET框架”的消息,需要大约一分钟左右才能完成。完成后建议再次重启计算机。
祝好运!

1

1

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


1
@jojodmo:实际上,“对我来说,因为项目路径太长”对于错误调试似乎是一个有效的贡献... - Christian Severin

1

我在搜索“golang Windows (0xc00007b)”时来到这里。

我有一个用Golang编写的应用程序,使用iconv。它在我的电脑上运行正常,但在别人的电脑上却不行。

第一个错误是缺少DLL:libiconv-2.dll,所以我猜他们从互联网上下载了32位而不是64位版本,因此出现了0xc00007b错误

我在我的系统上搜索该DLL,但没有成功,直到我在MinGW 64路径中搜索到它,即在我的情况下是:C:\msys64\mingw64\bin

解决方案是将DLL与.exe一起分发,该DLL位于MinGW文件夹中。


1
我在从我的代码库中提取代码并在新机器上编译时遇到了这个问题。复制整个代码库然后编译会得到一个可执行文件,它可以正常工作。原来是一个32位的DLL没有被检入。如上所述,请使用 "Dependency Walker" 找出问题所在。为了更清楚地查找问题,请参见下面的屏幕截图。在后台中,exe尝试加载错误的DLL(注意“64”),导致“应用程序无法正确启动0xc00007b”,在前景中的exe只是简单地复制过来的(包括正确的DLL)。

Dependency Walker


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

1

1
如果由于某种原因从 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

1
常见控件是操作系统的一部分。操作系统知道从哪里加载正确的版本。这对解决 OP 的问题没有任何帮助。它甚至不安装依赖项。它所做的只是将一个清单资源编译到应用程序中,以使用常见控件的第 6 版本。预处理器条件也不需要。只需设置 processorArchitecture='*',就可以了。 - IInspectable

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