Windows 7、64位,DLL问题


268

我的可执行文件有问题。我正在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天试用版)包装盒上使用。

x86 Dependency 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文件
  • GPSVC.DLL
  • IESHIMS.DLL

我在Google上搜索了这些API-MS-WIN -... DLL文件,发现它们实际上应该已经是Windows 7的一部分(尽管有些网站声称属于Windows 8和Windows Server 2012)。

我已经尝试了建议的修复程序,这些修复程序是:

  • 运行'sfc / scannow'
  • 安装Visual Studio 2008 SP1运行时可执行文件

但这并不能解决任何问题。:-(

旁注:我的开发箱也没有它们,并且似乎也不需要它们。例如,我的机器上的user32.dll没有链接到其中之一,而VMware上的安装却链接了其中的一个。

关于如何解决此问题的任何想法?我试图在Microsoft页面上找到合适的下载/修复程序,但失败了。


解决问题后,我想报告发现的问题,由于问题已经解决,因此我无法将其发布为答案。

实际上,所报告的所有DLL文件都是Dependency Walker工具丢失的,即那些

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

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

在我的情况下,三个OCX文件的注册丢失了,并且一切都很好,但是即使程序现在运行良好,BUT Dependency Walker工具仍然列出了与以前完全相同的DLL文件。

要点:如其他人所述,该工具到现在为止已经过时,并且不能始终在更新的OS上正常使用。因此,请睁大眼睛,不要因缺少'API-MS-WIN-CORE-COM-L1-1-0.DLL'而引起误导,...问题可能完全出在其他地方。


1
据我所知,DirectComposition在Windows 7上不可用(DCOMP.DLL)。
布赖恩

156
重新打开这个怎么样?我的Google搜索将其关闭后仅20个小时,我就被问到了这个问题,原因是它“可能无法帮助任何未来的访问者” ...
Christian Severin 2013年

27
您必须注册哪个3个ocx文件,更重要的是,您是如何知道的?我一直停留在这几天,现在
本布拉默

2
大家好。我想我已将其钉牢(请参阅下文),但是作为一个旁注,您可以放心地忽略链接到IESHIMS.DLL和GPSVC.DLL的失败。基本上,我在Win7中编译的所有内容都会出现此问题,并且似乎对功能没有影响。现在,这种经验来自大约30多种二进制文件。 叹息,我讨厌这样的事情,讨厌做Windows开发。
meawoppl 2013年

3
nirsoft.net/articles/windows_7_kernel_architecture_changes.html很好地解释了导致api-ms- win- * DLL的Windows 7内核更改-我认为DependencyWalker不能处理这些更改-因此不必担心太多。来自MS:msdn.microsoft.com/zh-CN/library/hh802935%28v=vs.85%29.aspx
x29a 2014年

Answers:


63

此问题与缺少Visual Studio“可分发包”有关。基于依赖关系遍历,哪一个丢失不明显,但是我会首先尝试与您的编译器版本相对应的那个,然后看运行是否正常:

Visual Studio 2015

Visual Studio 2013

Visual Studio 2010

Visual Studio 2008年

我遇到了这个问题,因为我使用的是Visual Studio编译器,而不是完整的Visual Studio环境。


敢于在此处注入新的链接:最新的受支持的Visual C ++下载SteinÅsmul,29.11.2018



1
另外,似乎这可能是由于在Win 7的某些版本上安装了可重新分发的软件包而引起的。谢谢m $。
meawoppl 2014年

我对此也有疑问,并且相信有多种解决方法。就我而言,我注意到使用调试配置进行编译导致我的com dll无法注册。但是,当我将配置更改为发布时,我可以进行干净注册。我的环境是VS2012。我确实将正确的redist(x64版本)文件复制到与com dll相同的文件夹中。
Jim Kennedy

注意,一些较新的Win SDK / DDK也随附其中一些!
meawoppl 2014年

1
VS2015 vcredist _ *。exe将安装这些DLL,但其他方法(如VS随附的MSM)则不会。vcredist包括这些DLL,并且您将需要最低要求的平台。(请注意,我必须两次安装Windows 7 sp1才能生效
-WU

19

我刚刚使用MSCVC 2012解决了C ++ Qt 5和Windows 7 64位的相同问题。

一开始我以为是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 2014年

2
这仅适用于启动时加载的直接dll依赖项。如果您的程序或dll将延迟加载或动态加载某些dll,则无法通过您的方法找到它们。
A. Binzxxxxxx 2014年

注意,这样做还可以使您的应用程序对PATH变量的顺序敏感,在某些情况下加载系统版本,而在其他情况下加载本地文件夹中的系统版本。M $将此称为安全问题,但坦率地说,这是在负载中使用CWD的错误:support.microsoft.com/en-us/kb/2389418
meawoppl

3
那不应该手动完成。有windeployqt用于该工具的工具,请参见例如stackoverflow.com/a/33292008/4023446
Orest Hera 2015年

1
@OrestHera windeployqt经常复制不必要的文件。

16

我只是解决了同样的问题。

Dependency Walker在这种情况下会产生误导,并导致我浪费时间。因此,第一篇文章中“丢失”的DLL文件列表没有帮助,您可能会忽略它。

解决方案是找到您的项目正在调用的引用,并检查它们是否确实安装在服务器上。

@Ben Brammer,丢失三个.ocx文件并不重要,因为它们仅在Leo T Abraham的项目中丢失。您的项目可能会调用其他DLL文件。

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

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


12

如前所述,DCOMP是VC ++可再发行文件的一部分(实现OpenMP运行时),并且是唯一真正缺失的组件。所有其余的都是虚假报告。

特别是API-MS-WIN-XXXX.DLL是API集合 - 本质上,这是自Windows 7以来逐渐引入的额外级别的调用间接。Dependency Walker开发似乎在此之前就已停止,并且它无法正确处理API集合。

因此,没有什么可担心的。您再也不会缺少任何东西了。

查找丢失(如果确实存在问题)的真正需要的DLL文件的更好的选择是运行Process Monitor并从故障中退后一步,在所有系统路径中搜索特定DLL文件的故障探针序列。


为ProcessMonitor +1。它可以从Microsoft免费下载。附加到matlab流程,您可以看到所有正在发生的事情,包括dll加载
Janus,2007年

6

我也遇到了这个问题,但是在这里(我在网上其他地方看到过)的解决方案似乎是一个普通的线程,它是“ [重新安装可再发行软件包”。但是,对于我来说,这是行不通的,因为在运行我们产品的安装程序(安装可再发行组件包)以测试我们崭新的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中的Universal 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)。


5

这个贡献并没有真正回答最初的问题,但是考虑到该线程的命中率,我认为有很多人在处理找不到API-MS-WIN-CORE-库的问题。

通过简单地更新Visual Studio,我的应用程序拒绝以未找到API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL的错误消息开头,因此能够解决该问题。

我不认为我的构建环境(Windows 7 Pro SP1,Visual Studio Ultimate 2012)被完全搞砸了,对于我的大多数项目来说,它都可以正常工作。但是在某些非常特殊的情况下,我收到了错误消息(请参见下文)。

经过更新的Visual Studio 11从最初的CD-版本(我忘了抬头看版本号),版本更新11.0.61030.00 4还破碎的项目重新运行。

应用程序启动时出现错误信息


链接已(有效)断开(“抱歉,此下载不再可用。”)。
彼得·莫滕森

@PeterMortensen我找到了指向Update 5的链接,但不知道建议的解决方法是否仍然适用。更新4不再可用。这里是VS2012的更新列表。报告的产品结束日期是10/2023。
normanius

3

这为我解决了这个问题:

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


1
安装说明建议您卸载重新分发软件包,因为它们包含上述DLL的冗余版本,并会导致代码和其他形式的Win7 herp-derp的动态链接混乱。为什么在安装过程中对您不起作用,我们可以安全地将其归档为#iwishihadarealpackagemanager。
meawoppl 2013年

1
也为我工作。花费了很多时间,安装了.net DirectX,但是重新安装msvc ++起作用了
NoWomenNoCry

2

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


1

对于任何来这里但遇到Photoshop问题的人:我的解决方案是先卸载MS VC ++可再发行的x86和64。然后安装适合Windows版本和体系结构(86或64)的一种。



0

我有同样的问题。花了几个小时在网上搜索后,我找到了解决方案。

我将文件combase.dll文件(C:\ Windows \ System32)复制到了发行文件夹中,它解决了该问题。


2
在您的路径上安装随机dll是一个不好的主意。
meawoppl '18

0

在尝试全新安装Windows 7 OEM后,升级到Windows 10后,出现了此问题。

在搜索了Microsoft论坛等之后,我发现了以下对我有用的解决方案:

替换C:\Windows10Upgrade\wimgapi.dllC:\Windows\System32\wimgapi.dll


在您的路径上安装随机dll是一个不好的主意。
meawoppl '18

当然可以,但是当它是全新安装时,有什么要打破的?:D
djsmiley2kStaysInside

0

我建议还检查当前正在使用多少内存。

事实证明,无法找到这些DLL文件是试图在Visual Studio中运行程序(运行或调试)时出现的第一个症状。

经过半个多小时的脑力劳动之后,搜索网络,运行Process MonitorTask Manager并视情况而定,自开始以来一直在运行的完全不同的程序报告“内存不足;请尝试停止某些程序”或类似的东西。在杀死了Firefox,Thunderbird,Process Monitor并依赖之后,一切又恢复了。


0

只是为了在这里确认答案,我的解决方案是将未加载的DLL及其随附​​的ocx文件复制到system32文件夹中,从而解决了我的问题。

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.