我的可执行文件有问题。我在我的Windows 7 64位开发盒上运行这个c++ 32位可执行文件,它也有所有的微软应用程序(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 -女士赢得核心- com - l1 - 1 - 0. - dll api -女士赢得核心- winrt错误- l1 - 1 - 0. - dll api -女士赢得核心- winrt - l1 - 1 - 0. - dll api -女士赢得核心- winrt robuffer - l1 - 1 - 0. - dll api -女士赢得核心- winrt字符串- l1 - 1 - 0. - dll api -女士赢得shcore -扩展- 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上的安装则链接到其中一个。

有什么办法解决这个问题吗? 我试图在微软页面上找到合适的下载/修复,但我失败了。


在解决我的问题后,我想报告我发现的东西,但我不能把这个作为答案,因为这个问题已经结束了。

实际上,所有的DLL文件报告丢失的依赖项行走工具,即那些

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

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

在我的情况下,三个OCX文件的注册丢失了,之后一切都很好,但依赖步行者工具仍然列出了所有相同的DLL文件,就像以前一样,即使现在程序运行良好。

它的要点:正如其他人所说,这个工具现在有点过时了,在更新的操作系统上并不总是能正常工作。因此,请睁大眼睛,不要被遗漏的'API-MS-WIN-CORE-COM-L1-1-0.DLL'误导,…问题可能完全出在别处。


当前回答

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

一开始我认为这是MSVC/Windows DLL文件的问题,但正如BorisP所说,问题是在我的项目依赖。关键是“如何知道你在Qt 5中的项目依赖关系?”

因为我没有找到任何清楚的方法来知道它(Dependency Walker并没有帮助我很多…),我接下来遵循了“逆过程”,只需不超过5分钟,就可以避免大量令人头疼的DLL文件依赖:

编译项目并将可执行文件放到一个空文件夹:myproject.exe 尝试执行它,它将检索一个错误(丢失DLL文件…) 现在,从Qt复制所有DLL文件(在我的情况下,它们在C:\Qt\Qt5.1.1\5.1.1\msvc2012_64_opengl\bin)到这个文件夹。 尝试再执行一次,它可能会正常工作。 开始逐步删除,并尝试每次您的可执行文件仍然工作,尽量留下最少的必要DLL文件。

当你在同一个文件夹中有所有的DLL文件时,更容易找到其中哪些是无效的(XML, WebKit,…)Whatever .),因此这个方法不会超过5分钟。

其他回答

如前所述,DCOMP是vc++可重分发组件(实现OpenMP运行时)的一部分,也是唯一真正缺失的组件。其余的都是假报道。

具体来说,API-MS-WIN-XXXX.DLL是api集——本质上是自Windows 7以来逐渐引入的一种额外级别的调用间接。Dependency Walker的开发似乎早在那之前就停止了,而且它不能正确地处理API集。

所以没有什么好担心的。你不会再错过任何东西了。

寻找真正需要的丢失的DLL文件(如果确实是问题所在)的一个更好的替代方法是运行Process Monitor并从失败中后退一步,在所有系统路径中搜索特定DLL文件的失败探测序列。

在新安装的Windows 7上安装SQL Server Management Studio 2014解决了我们客户端的这个问题。

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

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

经过半个多小时的绞尽脑汁、搜索网页、运行进程监视器和任务管理器以及依赖之后,一个从一开始就一直在运行的完全不同的程序报告说“内存不足;试着停止一些程序”。在杀死Firefox、雷鸟、进程监视器和依赖之后,一切都恢复正常了。

对于那些来到这里,但有ps问题的人:我的解决方案是卸载mvc++可重新分发的第一个x86和64。然后安装一个适合Windows版本和体系结构(86或64)的软件。

我也遇到了这个问题,但解决方案似乎是一个常见的线程,在这里,我在网络上看到的其他地方,是“[重新]安装可重新分发的包”。然而,对我来说,这并不管用,因为当运行我们产品的安装程序(安装可重分发包)来测试我们闪闪发光的新Visual Studio 2015版本时,问题出现了。

出现此问题是因为列出的DLL文件不在Visual Studio安装路径中(例如,C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist),因此没有添加到安装中。这些api-ms-win-* dll被安装到Windows 10 SDK安装路径中,作为Visual Studio 2015安装的一部分(例如C:\Program Files (x86)\Windows Kits\10\Redist)。

Installing on Windows 10 worked fine, but installing on Windows 7 required adding these DLL files to our product install. For more information, see Update for Universal C Runtime in Windows which describes the addition of these dependencies caused by Visual Studio 2015 and provides downloads for various Windows platforms; also see Introducing the Universal CRT which describes the redesign of the CRT libraries. Of particular interest is item 6 under the section titled Distributing Software that uses the Universal CRT:

Updated September 11, 2015: App-local deployment of the Universal CRT is supported. To obtain the binaries for app-local deployment, install the Windows Software Development Kit (SDK) for Windows 10. The binaries will be installed to C:\Program Files (x86)\Windows Kits\10\Redist\ucrt. You will need to copy all of the DLLs with your app (note that the set of DLL files are necessary is different on different versions of Windows, so you must include all of the DLL files in order for your program to run on all supported versions of Windows).