ChatGPT解决这个技术问题 Extra ChatGPT

Windows 7、64 位、DLL 问题

我的可执行文件有问题。我在我的 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

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

我已经尝试了我发现的建议修复,它们是:

运行“证监会 /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 多个二进制文件。叹息我讨厌-讨厌-讨厌出于这样的原因做 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

P
Peter Mortensen

此问题与缺少 Visual Studio“可再发行包”有关。根据依赖遍历,缺少哪个并不明显,但我会先尝试与您的编译器版本对应的那个,看看是否运行正常:

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 日


此外,似乎这可能是由于在某些版本的 Win 7 上安装可再分发包引起的。谢谢 m$。
我也有这个问题,并且相信有多种方法可以解决它。就我而言,我注意到使用调试配置进行编译导致我的 com dll 无法注册。但是,当我将配置更改为发布时,我能够进行干净的注册。我的环境是 VS 2012。我确实将正确的 redist(x64 版本)文件复制到与我的 com dll 相同的文件夹中。
NB 一些较新的 win SDK/DDK 也附带其中一些!
VS2015 vcredist_*.exe 会安装这些 DLL,但其他方法(如 VS 提供的 MSM)则不会。 vcredist 包括这些 DLL,您需要最低要求的平台。 (注意我必须安装两次 windows 7 sp1 才能生效 - 吴撒谎!)microsoft.com/en-us/download/details.aspx?id=48234
P
Peter Mortensen

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

一开始我以为是 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 ......无论什么......),因此这种方法不会花费超过五分钟的时间。


如果缺少的 DLL 是 GAC 程序集,此方法将帮助您确定缺少哪些 DLL(错误消息应该告诉您它无法加载哪个程序集),然后您必须弄清楚要安装哪个工具包或框架将它们放入 GAC(或包含在您的发行版中)的机器。
这仅适用于启动时加载的直接 dll 依赖项。如果您的程序或 dll 将延迟或动态加载某些 dll,您将无法使用您的方法找到它们。
还请注意,这样做会使您的应用程序对 PATH 变量的顺序敏感,在某些情况下加载系统版本,在其他情况下加载本地文件夹中的版本。 M$ 称这是一个安全问题,但坦率地说,在负载中使用 CWD 是他们的错:support.microsoft.com/en-us/kb/2389418
这不应该手动完成。有 windeployqt 工具,例如 stackoverflow.com/a/33292008/4023446
@OrestHera windeployqt 经常复制不必要的文件。
P
Peter Mortensen

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

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

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

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

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

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


P
Peter Mortensen

如前所述,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
P
Peter Mortensen

我也遇到了这个问题,但这里似乎是一个常见的线程,我在网上其他地方看到的解决方案是“[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 平台的下载;另请参阅描述 CRT 库的重新设计的 Introducing the Universal CRT。特别感兴趣的是标题为分发使用通用 CRT 的软件部分下的第 6 项:

2015 年 9 月 11 日更新:支持通用 CRT 的应用本地部署。要获取用于应用本地部署的二进制文件,请安装适用于 Windows 10 的 Windows 软件开发工具包 (SDK)。这些二进制文件将安装到 C:\Program Files (x86)\Windows Kits\10\Redist\ucrt。您将需要使用您的应用程序复制所有 DLL(请注意,所需的 DLL 文件集在不同版本的 Windows 上是不同的,因此您必须包含所有 DLL 文件才能使您的程序在所有支持的版本上运行窗口)。


这个答案应该被赞成,因为它直接解决了这个问题。安装 KB2999226 通常可以在平均干净的 Windows 7/8.1 上解决此类问题 - 它会安装那些所需的 DLL,例如 API-MS-WIN-*.dll
P
Peter Mortensen

这个贡献并没有真正回答最初的问题,但考虑到这个线程的命中率,我假设有很多人在处理找不到 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 更新 4 之后,损坏的项目再次运行。

https://i.stack.imgur.com/UOf2o.png


该链接(实际上)已损坏(“我们很抱歉,此下载不再可用。”)。
@PeterMortensen 我找到了 this link to Update 5,但不知道建议的解决方法是否仍然适用。更新 4 不再可用。这里是list of updates for VS2012。报告的产品结束日期为 10/2023。
P
Peter Mortensen

这为我解决了这个问题:

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


安装说明建议您卸载重新分发包,因为它们包含上述 DLL 的冗余版本,并且会导致代码和其他形式的 Win7 herp-derp 的动态链接混淆。为什么它不会在安装过程中为您执行此操作,我们可以安全地归档为 #iwishihadaralpackagemanager。
也为我工作。花了这么多时间,安装.net directx,但重新安装 msvc++ 工作
K
Kim

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


P
Peter Mortensen

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


P
Peter Mortensen

经过两天荒谬的战斗,在新安装的 Windows 7 上安装 SQL Server Management Studio 2014 在我们的客户端解决了这个问题。


存在许多其他答案,也许最好作为评论
P
Peter Mortensen

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

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


在您的路径上安装随机 dll 是一个坏主意。
P
Peter Mortensen

在尝试全新的 Windows 7 OEM 安装并升级到 Windows 10 后,我来到这里时出现了这个问题。

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

将 C:\Windows10Upgrade\wimgapi.dll 替换为 C:\Windows\System32\wimgapi.dll 中的那个


在您的路径上安装随机 dll 是一个坏主意。
当然是这样,但是当它是全新的安装时,有什么要打破的呢? :D
P
Peter Mortensen

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

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

经过半个多小时的头疼,搜索网络,运行 Process MonitorTask Manager 并依赖,一个完全不同的程序从一开始就一直在运行,报告“内存不足;尝试停止一些程序”或类似的。在杀死 Firefox、Thunderbird、Process Monitor 和依赖后,一切都恢复了。


p
po10cySA

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅