Windows 7、64 位、DLL 问题
Posted
技术标签:
【中文标题】Windows 7、64 位、DLL 问题【英文标题】:Windows 7, 64 bit, DLL problems 【发布时间】:2013-06-10 12:02:23 【问题描述】:我的可执行文件有问题。我在我的 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.DLL 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 页面上找到合适的下载/修复,但失败了。
解决我的问题后,我想报告我的发现,但由于问题已关闭,我无法将其发布为答案。
实际上是 Dependency Walker 工具报告丢失的所有 DLL 文件,即那些
* API-MS-WIN-CORE-...
类型 DLL 文件不是实际问题的一部分。
在我的情况下,三个 OCX 文件的注册丢失了,之后一切都很好,但 Dependency Walker 工具仍然列出了所有与以前完全相同的 DLL 文件,即使程序现在运行良好。
它的要点:正如其他人所说,该工具现在有点过时了,并不总是能在较新的操作系统上正常工作。因此,请睁大眼睛,不要因缺少“API-MS-WIN-CORE-COM-L1-1-0.DLL”而被误导,...问题可能完全出在其他地方。
【问题讨论】:
据我所知,DirectComposition 在 Windows 7 上不可用 (DCOMP.DLL)。 重新打开这个怎么样?我的谷歌搜索让我在它被关闭后仅仅 20 小时就提出了这个问题,因为它“不太可能帮助任何未来的访问者”...... 您必须注册哪 3 个 ocx 文件,更重要的是,您是如何计算出来的?我已经坚持了几天了 大家好。我想我搞定了这个(见下文),但作为旁注,您可以放心地忽略链接到 IESHIMS.DLL 和 GPSVC.DLL 的失败。它基本上出现在我在 Win7 中编译的所有内容中,并且似乎对功能没有影响。这种经验来自现在大约 30 多个二进制文件。 sigh 出于这样的原因,我讨厌-讨厌-讨厌做 Windows 开发。 导致 api-ms-win-* DLL 的 Windows 7 内核更改在这里得到了很好的解释 nirsoft.net/articles/windows_7_kernel_architecture_changes.html - 我认为 DependencyWalker 无法处理这些更改 - 所以不要太担心这些。来自 MS:msdn.microsoft.com/en-us/library/hh802935%28v=vs.85%29.aspx 【参考方案1】:此问题与缺少 Visual Studio“可再发行包”有关。根据依赖遍历,尚不清楚缺少哪个,但我会先尝试与您的编译器版本对应的那个,看看是否运行正常:
Visual Studio 2015
Visual Studio 2013
Visual Studio 2010
Visual Studio 2008
我遇到了这个问题,因为我使用的是 Visual Studio 编译器,而不是完整的 Visual Studio 环境。
敢在这里注入一个新的链接:The latest supported Visual C++ downloads。 Stein Åsmul,2018 年 11 月 29 日。
【讨论】:
另见:***.com/questions/7568697/… 另外,这似乎是由于在某些版本的 Win 7 上安装了可再发行包造成的。谢谢 m$。 我也有这个问题,我相信有多种方法可以解决它。就我而言,我注意到使用调试配置进行编译导致我的 com dll 无法注册。但是,当我将配置更改为发布时,我能够进行干净的注册。我的环境是 VS 2012。我确实将正确的 redist(x64 版本)文件复制到与我的 com dll 相同的文件夹中。 请注意,一些较新的 win SDK/DDK 也附带其中一些! VS2015 vcredist_*.exe 会安装这些 DLL,但其他方法(例如 VS 提供的 MSM)则不会。 vcredist 包括这些 DLL,您需要最低要求的平台。 (注意我必须安装两次 windows 7 sp1 才能生效 - 吴撒谎!)microsoft.com/en-us/download/details.aspx?id=48234【参考方案2】:我刚刚使用 MSCVC 2012 解决了 C++ Qt 5 和 Windows 7 64 位的相同问题。
一开始我以为是 MSVC/Windows DLL 文件问题,但正如 BorisP 所说,问题出在我的项目依赖项中。关键是“如何知道 Qt 5 中的项目依赖关系?”。
由于我没有找到任何明确的方法来了解它(Dependency Walker 对我没有多大帮助......),我接下来遵循了不超过 5 分钟的“逆过程”,并且避免了很多DLL 文件依赖项令人头疼的问题:
-
编译您的项目并将可执行文件放到一个空文件夹中:myproject.exe
尝试执行它,它会返回一个错误(缺少 DLL 文件...)。
现在,复制所有 DLL 文件从 Qt(在我的例子中它们位于 C:\Qt\Qt5.1.1\5.1.1\msvc2012_64_opengl\bin)到这个文件夹。
再次尝试执行,应该可以正常运行。
开始逐步删除,并在每次可执行文件仍然有效时尝试,尽量保留最少的必要 DLL 文件。
当您将所有 DLL 文件都放在同一个文件夹中时,更容易找到其中哪些无效(XML、WebKit、... 等等),因此此方法不会花费超过五分钟的时间.
【讨论】:
如果丢失的 DLL 是 GAC 程序集,此方法将帮助您识别哪些 DLL 丢失(错误消息应该告诉您它无法加载哪个程序集),然后您必须弄清楚确定在机器上安装哪个工具包或框架,以将它们放入 GAC(或包含在您的发行版中)。 这仅适用于启动时加载的直接 dll 依赖项。如果您的程序或 dll 会延迟或动态加载某些 dll,您无法使用您的方法找到它们。 请注意,这样做会使您的应用程序对 PATH 变量的顺序敏感,在某些情况下加载系统版本,在其他情况下加载本地文件夹中的版本。 M$ 称这是一个安全问题,但坦率地说,在负载中使用 CWD 是他们的错:support.microsoft.com/en-us/kb/2389418 不应该手动完成。有windeployqt
工具,例如***.com/a/33292008/4023446
@OrestHera windeployqt
经常复制不必要的文件。【参考方案3】:
我刚刚解决了同样的问题。
Dependency Walker 在这种情况下具有误导性,导致我浪费了时间。因此,第一篇文章中“丢失”的 DLL 文件列表没有帮助,您可以忽略它。
解决方案是找出你的项目正在调用的引用,并检查它们是否真的安装在服务器上。
@Ben Brammer,缺少哪三个 .ocx 文件并不重要,因为它们仅在 Leo T Abraham 的项目中丢失。您的项目可能会调用其他 DLL 文件。
在我的例子中,不是三个 .ocx 文件,而是缺少 mysql 连接器 DLL 文件。在服务器上安装 MySQL Connector for .NET 后,问题就消失了。
所以,简而言之,解决方案是:检查您的所有项目引用是否都在那里。
【讨论】:
【参考方案4】:如前所述,DCOMP 是 VC++ 可再发行组件(实现 OpenMP 运行时)的一部分,并且是唯一真正缺失的组件。其余均为虚假报道。
API-MS-WIN-XXXX.DLL 是 API 集 - essentially, an extra level of call indirection 从 Windows 7 开始逐渐引入。Dependency Walker 开发似乎在此之前很久就停止了,无法处理API 设置正确。
所以没有什么可担心的。你不会再错过任何东西了。
找到真正需要的丢失的 DLL 文件(如果这确实是问题)的更好替代方法是运行 Process Monitor 并从失败中退后一步,在所有特定的 DLL 文件中搜索失败的探针序列系统路径。
【讨论】:
+1 用于 ProcessMonitor。它是从微软免费下载的。附加到 matlab 进程,你可以看到正在发生的一切,包括 dll-loads【参考方案5】:我也遇到了这个问题,但是我在网上其他地方看到的似乎是一个常见线程的解决方案是“[re]install the redistributable package”。但是,对我来说这不起作用,因为在运行我们产品的安装程序(安装可再发行包)以测试我们闪亮的新 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 文件添加到我们的产品安装中。有关更多信息,请参阅 Update for Universal C Runtime in Windows,其中描述了 Visual Studio 2015 导致的这些依赖项的添加,并提供了适用于各种 Windows 平台的下载;另请参阅 Introducing the Universal CRT,其中描述了 CRT 库的重新设计。特别感兴趣的是标题为分发使用通用 CRT 的软件部分下的第 6 项:
2015 年 9 月 11 日更新:支持通用 CRT 的应用本地部署。要获取用于应用本地部署的二进制文件,请安装适用于 Windows 10 的 Windows 软件开发工具包 (SDK)。这些二进制文件将安装到 C:\Program Files (x86)\Windows Kits\10\Redist\ucrt。您将需要使用您的应用程序复制所有 DLL(请注意,所需的 DLL 文件集在不同版本的 Windows 上是不同的,因此您必须包含所有 DLL 文件才能使您的程序在所有支持的版本上运行Windows)。
【讨论】:
这个答案应该被赞成,因为它直接解决了这个问题。安装 KB2999226 通常可以在平均干净的 Windows 7/8.1 上解决此类问题 - 它会安装那些所需的 DLL,例如API-MS-WIN-*.dll
【参考方案6】:
这个贡献并没有真正回答最初的问题,但考虑到这个线程的命中率,我假设有很多人在处理找不到 API-MS-WIN-CORE-库的问题.
我能够通过简单地更新 Visual Studio 来解决我的应用程序拒绝启动错误消息 API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL 未找到的问题。
我不认为我的构建环境(Windows 7 Pro SP1、Visual Studio Ultimate 2012)完全搞砸了,它适用于我的大多数项目。但在某些非常特殊的情况下,我收到了错误消息(见下文)。
在updating Visual Studio 11 从最初的 CD 版本(我忘了查找版本号)到版本 11.0.61030.00 Update 4 之后,损坏的项目又开始运行了。
【讨论】:
链接(实际上)已损坏(“很抱歉,此下载不再可用。”)。 @PeterMortensen 我找到了this link to Update 5,但不知道建议的解决方法是否仍然适用。更新 4 不再可用。这里是list of updates for VS2012。报告的产品结束日期为 10/2023。【参考方案7】:这为我解决了这个问题:
如果您已安装 Visual Studio 2010 可再发行包,请卸载它,然后安装 Microsoft Windows 7 SDK。
【讨论】:
安装说明建议您卸载重新分发包,因为它们包含上述 DLL 的冗余版本,并且会导致代码和其他形式的 Win7 herp-derp 的动态链接混淆。为什么它不会在安装过程中为您执行此操作,我们可以安全地归档为#iwishihadaralpackagemanager。 也为我工作。花了这么多时间,安装 .net directx,但重新安装 msvc++ 工作【参考方案8】:我解决了这个问题。当我注册 OCX 文件时,我使用以管理员身份执行的命令窗口运行它。
【讨论】:
【参考方案9】:对于任何来到这里但遇到Photoshop 问题的人:我的解决方案是首先卸载 MS VC++ 可再发行组件 x86 和 64。然后安装一个适合 Windows 版本和架构(86 或 64)的。
【讨论】:
【参考方案10】:在新安装的 Windows 7 上安装 SQL Server Management Studio 2014 在经过两天荒谬的战斗后在我们的客户端解决了这个问题。
【讨论】:
存在许多其他答案,也许最好作为评论【参考方案11】:我遇到了同样的问题。在网上花了几个小时搜索后,我找到了适合我的解决方案。
我将文件 combase.dll 文件 (C:\Windows\System32) 复制到发布文件夹,它解决了问题。
【讨论】:
在你的路径上安装随机 dll 是个坏主意。【参考方案12】:在尝试全新的 Windows 7 OEM 安装并升级到 Windows 10 后,我遇到了这个问题。
在搜索了一些微软论坛等之后,我发现了以下对我有用的解决方案:
将
C:\Windows10Upgrade\wimgapi.dll
替换为C:\Windows\System32\wimgapi.dll
中的那个
【讨论】:
在你的路径上安装随机 dll 是个坏主意。 当然可以,但是如果是全新安装,有什么要破解的? :D【参考方案13】:我建议还检查当前使用了多少内存。
事实证明,无法找到这些 DLL 文件是尝试在 Visual Studio 中运行程序(运行或调试)时出现的第一个症状。
经过半个多小时的头疼,搜索网络,运行Process Monitor和Task Manager,并且依赖,一个完全不同的程序从一开始就一直在运行,报告“内存不足;尝试停止某些程序”或类似的程序。杀死 Firefox、Thunderbird、Process Monitor 和依赖后,一切都恢复正常了。
【讨论】:
【参考方案14】:只是为了在这里确认答案,我的解决方案是将未加载的 DLL 和随附的 ocx 文件复制到 system32 文件夹,这解决了我的问题。
【讨论】:
以上是关于Windows 7、64 位、DLL 问题的主要内容,如果未能解决你的问题,请参考以下文章
将 32 位 COM DLL 注册到 64 位 Windows 7
Python 3.5、OpenCV 3.2、Windows 7 64 位、Anaconda 3、“ImportError:DLL 加载失败”
为 32 位 exe 加载 32 位库时,Windows 7 64 位路径不正确