Windows 7,64位,DLL问题

281
我有一个关于我们可执行文件的问题。我在我的Windows 7 64位开发电脑上运行这个C ++ 32位可执行文件,该电脑还安装了所有这些Microsoft应用程序(Visual Studio 2008 + 2010、TFS、SDK、Microsoft Office)...并且它仍然可以正常运行。
现在我拿到了同样的客户端安装程序,并被要求在干净的Windows 7安装中进行测试。因此,我获得了一个Windows 7 64位VMware,并将其更新为Windows 7 SP 1(与我的开发者电脑相同的版本)。但是,在我的开发者电脑上一切正常的情况下,该程序在VMware(30天试用版)上无法运行。
x86Dependency Walker告诉我缺少以下DLL文件:
  • API-MS-WIN-CORE-COM-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
  • API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL
  • DCOMP.DLL
  • GPSVC.DLL
  • IESHIMS.DLL
我在谷歌上搜索了那些API-MS-WIN-... DLL文件,发现它们实际上应该已经是Windows 7的一部分了(虽然有些网站声称它们属于Windows 8和Windows Server 2012)。
我已经尝试了我找到的建议的修复方法,这些方法包括:
运行“sfc /scannow”
安装Visual Studio 2008 SP1运行时可执行程序
但这并没有解决任何问题。 :-(
顺便提一下:我的开发电脑也没有这些文件,似乎也不需要它们。例如,我的盒子上的user32.dll没有与其中一个链接,而VMware上的安装则有。
有什么解决此问题的想法吗? 我试图在微软页面上找到适当的下载/修复程序,但失败了。

解决了我的问题后,我想报告一下我发现的情况。但由于该问题已关闭,因此我无法将其发布为答案。

实际上,所有由Dependency Walker工具报告为缺失的DLL文件,即那些

* API-MS-WIN-CORE-...

类型为DLL的文件并不是实际问题的一部分。

在我的情况下,缺少三个OCX文件的注册,之后一切都很好,但是Dependency Walker工具仍然列出了所有相同的DLL文件,即使程序现在正常运行。

要点是:正如其他人所述,该工具现在有点过时,并且在较新的操作系统上不总是能正常工作。因此,保持警惕,不要被缺少“API-MS-WIN-CORE-COM-L1-1-0.DLL”误导,...问题可能完全在其他地方。


1
据我所知,DirectComposition在Windows 7上不可用(DCOMP.DLL)。 - Brian
164
重新开放这个问题怎么样?我在谷歌搜索后仅20个小时之后发现它被关闭,理由是“不太可能帮助任何未来的访问者”… - Christian Severin
27
你需要注册哪3个ocx文件,更重要的是,你是如何找出这些信息的?我已经卡在这上面几天了。 - Ben Brammer
2
大家好。我认为我把这个问题解决了(见下文),但是顺便说一句,你可以安全地忽略链接到IESHIMS.DLL和GPSVC.DLL失败的错误。它在我在Win7编译的基本上所有东西中都出现了,似乎对功能没有影响。这种经验来自大约30多个二进制文件。* 呜叹 * 我讨厌做windows开发,就像这样的原因。 - meawoppl
3
这里很好地解释了导致api-ms-win-* DLLs的Windows 7内核变化:http://www.nirsoft.net/articles/windows_7_kernel_architecture_changes.html。我认为DependencyWalker无法处理这些更改,所以不必太担心。MS还提供了相关信息:http://msdn.microsoft.com/en-us/library/hh802935%28v=vs.85%29.aspx。 - x29a
显示剩余3条评论
14个回答

64

这个问题与缺少Visual Studio“redistributable package”有关。基于依赖关系,不清楚哪个丢失了,但是建议首先尝试与您的编译器版本相对应的那个,并查看是否正常运行:

Visual Studio 2015

Visual Studio 2013

Visual Studio 2010

Visual Studio 2008

我遇到了这个问题,因为我正在使用Visual Studio编译器,但没有完整的Visual Studio环境。


在此敢于插入一个新链接:The latest supported Visual C++ downloadsStein Åsmul,2018年11月29日


参见:https://dev59.com/L1vUa4cB1Zd3GeqPvq3l?rq=1 - meawoppl
1
同时,看起来这可能是由于在某些版本的Win 7上安装了可重新分发的软件包所导致的。感谢微软(m$)。 - meawoppl
我也遇到了这个问题,并且相信有多种方法可以解决它。在我的情况下,我注意到使用调试配置编译会导致我的com dll无法注册。但是,当我将配置更改为发布时,我能够进行干净的注册。我的环境是VS 2012。我确保将适当的redist(x64版本)文件复制到与我的com dll相同的文件夹中。 - Jim Kennedy
注意:一些较新的Win SDK/DDK也附带了其中一些! - meawoppl
1
VS2015 vcredist_*.exe 安装这些 DLL,但其他方法(如 VS 附带的 MSM)则不包括。vcredist 包含这些 DLL,并且您需要最低所需平台。(注意,我必须两次安装 Windows 7 SP1 才能生效 - WU 说谎了!)https://www.microsoft.com/en-us/download/details.aspx?id=48234 - GilesDMiddleton
“VS 2015” 不会向后兼容旧版本吗? - Martin Konecny

19
我刚刚用C++ Qt 5和Windows 7 64位的MSCVC 2012解决了相同的问题。一开始我以为是MSVC/Windows DLL文件的问题,但正如BorisP所说,问题出在我的项目依赖上。关键是“如何知道Qt 5中的项目依赖项?”由于我没有找到任何清晰的方法来了解它(Dependency Walker对我没有什么帮助...),因此我遵循了下面的“反向过程”,不超过5分钟,可以避免很多与DLL文件依赖项有关的头疼问题:
请按照以下步骤操作:
  1. 编译项目并将可执行文件拷贝到一个空文件夹中:myproject.exe
  2. 尝试执行它,会出现错误(缺少DLL文件...)。
  3. 现在,从Qt中复制所有的DLL文件(在我的情况下,它们位于C:\Qt\Qt5.1.1\5.1.1\msvc2012_64_opengl\bin中)到该文件夹中。
  4. 再次尝试执行,它可能会正常工作。
  5. 开始逐步删除并每次尝试确保可执行文件仍然可以工作,尝试只留下必要的最小DLL文件。
当您将所有DLL文件放在同一个文件夹中时,更容易找到哪些文件无效(XML,WebKit,...任何东西),因此此方法不需要超过五分钟。

如果缺失的 DLL 是 GAC 程序集,此方法将帮助您确定缺失的 DLL(错误消息应告诉您无法加载哪个程序集),然后您需要找出在机器上安装哪个工具包或框架以将它们放入 GAC(或与您的分发一起包含)。 - rcabr
3
这只适用于在启动时直接加载的DLL依赖项。如果您的程序或DLL将延迟或动态加载某些DLL,则无法使用您的方法找到它们。 - A. Binzxxxxxx
请注意,以这种方式进行操作会使您的应用程序对PATH变量的顺序敏感,在某些情况下加载系统版本,在其他情况下加载本地文件夹中的版本。微软称其为安全问题,但坦率地说,这是因为他们在加载时使用CWD造成的:https://support.microsoft.com/en-us/kb/2389418 - meawoppl
4
这不应该手动操作。有一个名为windeployqt的工具可以使用,例如请查看http://stackoverflow.com/a/33292008/4023446 - Orest Hera
1
@OrestHera windeployqt 经常会复制不必要的文件。 - user2487382

17

我刚刚解决了同样的问题。

Dependency Walker 在这种情况下是误导性的,浪费了我的时间。因此,第一篇帖子中列出的“缺失”的DLL文件列表并没有什么作用,你可能可以忽略它。

解决方案是找到你的项目引用了哪些文件,并检查它们是否真的安装在服务器上。

@Ben Brammer,重要的不是缺少哪三个.ocx文件,因为这只发生在Leo T Abraham的项目中。你的项目可能调用其他DLL文件。

在我的情况下,缺少的不是三个.ocx文件,而是MySQL连接器DLL文件。在服务器上安装了MySQL Connector for .NET之后,问题消失了。

所以,简而言之,解决方案是:检查所有项目引用是否存在。


16
如前所述,DCOMP是VC++可再发行组件的一部分(实现OpenMP运行时),也是唯一真正缺失的组件。其余所有报告都是错误的。
具体来说,API-MS-WIN-XXXX.DLL是API集 - 自Windows 7以来逐步引入的额外的调用间接层Dependency Walker 的开发似乎早在那之前就停止了,并且它不能正确处理API集。
因此,没有什么可担心的。你没有错过任何更多的内容。
找到确实缺失的DLL文件的更好的替代方法(如果确实存在问题)是运行Process Monitor并从失败开始向后步进,在所有系统路径中搜索特定DLL文件的失败探测序列。

1
+1 对于ProcessMonitor。它是微软提供的免费下载。附加到Matlab进程,您可以看到所有正在进行的操作,包括dll加载。 - Janus

7
我也遇到了这个问题,但是看起来似乎一个普遍的解决方案是“重新安装可再发行包”。然而,对于我来说,这并没有起作用,因为当运行我们产品的安装程序(它安装了可再发行包)以测试我们新的 Visual Studio 2015 构建时,问题出现了。
问题出现的原因是列出的 DLL 文件未位于 Visual Studio 安装路径中(例如,C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist),因此未被添加到安装中。这些 api-ms-win-* dll 文件作为 Visual Studio 2015 安装的一部分安装到 Windows 10 SDK 安装路径中(例如,C:\Program Files (x86)\Windows Kits\10\Redist)。
在Windows 10上安装很顺利,但在Windows 7上安装需要将这些DLL文件添加到我们的产品安装中。有关更多信息,请参见Windows通用C运行时更新,该文档描述了由Visual Studio 2015引起的这些依赖项的添加,并提供了各种Windows平台的下载链接;还请参见介绍通用CRT,其中描述了CRT库的重新设计。特别感兴趣的是标题为“分发使用通用CRT的软件”的部分下的项目6。
2015年9月11日更新:支持通用CRT的应用程序本地部署。要获取用于应用程序本地部署的二进制文件,请安装Windows 10的Windows软件开发工具包(SDK)。这些二进制文件将被安装到C:\ Program Files(x86)\ Windows Kits \ 10 \ Redist \ ucrt。您需要将所有DLL文件与您的应用程序一起复制(请注意,不同版本的Windows所需的DLL文件集合是不同的,因此必须包括所有DLL文件以使程序在所有受支持的Windows版本上运行)。

这个答案应该被点赞,因为它直接解决了这个问题。 在一个干净的 Windows 7/8.1 上安装 KB2999226 通常可以解决这个问题 - 它会安装那些必需的 DLL 文件,如 API-MS-WIN-*.dll - AntonK

5
这篇文章并没有真正回答最初的问题,但考虑到本帖的点击率,我认为有很多人在处理API-MS-WIN-CORE-库找不到的问题。
我成功解决了一个问题,我的应用程序拒绝启动,并显示错误消息API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL未找到,只需更新Visual Studio即可。
我不认为我的构建环境(Windows 7 Pro SP1,Visual Studio Ultimate 2012)完全混乱,它对大多数项目都运行良好。但在某些非常特定的情况下,我遇到了错误消息(见下文)。
Visual Studio 11从初始CD版本(我忘记查看版本号)更新到版本11.0.61030.00 Update 4后,破损的项目也再次运行。

Error message at application startup


链接已经(有效地)失效(“很抱歉,此下载不再可用。”)。 - Peter Mortensen
@PeterMortensen 我找到了这个链接更新5,但不知道建议的解决方法是否仍然适用。更新4已不再提供。这里是VS2012更新列表。报告的产品结束日期为10/2023。 - normanius

3

以下方法解决了我的问题:

如果您已经安装了Visual Studio 2010可再发行组件包,请先卸载它,然后安装Microsoft Windows 7 SDK


1
安装说明建议您卸载重新分发的软件包,因为它们包含上述DLL的冗余版本,并会导致代码和其他形式的Win7 herp-derp的动态链接混乱。为什么在安装过程中它不会为您执行此操作,我们可以安全地归类为#iwishihadarealpackagemanager。 - meawoppl
1
也对我有用。花了很多时间安装 .NET 和 DirectX,但重新安装 MSVC++ 就解决了问题。 - NoWomenNoCry

2

我解决了这个问题。当我注册OCX文件时,我使用以管理员身份运行的命令窗口来运行它。


1

对于任何遇到Photoshop问题的人:我的解决方案是先卸载MS VC++可再发行组件,包括x86和64位版本。然后安装适用于Windows版本和架构(86或64位)的一个版本。


0

我建议还要检查当前使用了多少内存。

事实证明,在尝试在Visual Studio中运行程序(无论是运行还是调试)时,找不到这些DLL文件是展示的第一个症状。

经过半个多小时的搜索、运行Process MonitorTask Manager以及Depends,一款从一开始就在运行的完全不同的程序报告说“内存不足,请尝试停止一些程序”或类似的内容。在关闭Firefox、Thunderbird、Process Monitor和Depends之后,一切都恢复正常了。


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