Visual Studio 2015 C++应用程序需要客户端客户端上的api-ms-win-crt-runtime-l1-1-0.dll

a p*_*erd 16 c++ windows dll visual-studio

我用Visual Studio 2015社区版构建了一个应用程序.当我的一些用户尝试运行它时,他们会收到以下错误:

程序无法启动,因为您的计算机缺少api-ms-win-crt-runtime-l1-1-0.dll.尝试重新安装该程序以解决此问题.

显然,这可以通过在Windows中安装Universal C Runtime更新来解决(KB2999226).我可以在安装脚本中检查修补程序,但我发现这样做的所有方法都太慢或不可靠.

如何防止发生此错误?我可以更改我的解决方案,以便我不需要这种依赖吗?我是否可以删除我可以删除的内容?我可以将修补程序与我的应用程序一起重新分发吗?

编辑:在项目属性中,"目标平台版本"为8.1,"平台工具集"为"Visual Studio 2015(v140)",如果这有帮助的话.

编辑2:我已经尝试将所有Universal C Runtime Library DLL复制到应用程序目录,因为Microsoft现在允许(但不建议)UCRT的本地模式安装.有41个文件C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64,api-ms-win-crt-runtime-l1-1-0.dll是其中之一.但是,现在运行应用程序会导致此错误:

应用程序无法正确启动(0xc0000142).单击"确定"关闭应用程序.

我已尝试使用MSVS 2015调试应用程序但无处可去.我在Dependency Walker中打开了可执行文件,看起来我错过了这个答案中列出的类似的DLL ,它说Dependency Walker是旧的,这是一个红色的鲱鱼.

我尝试通过Process Monitor(procmon)运行应用程序,并没有什么不寻常的.应用程序只需在WerFault.exe上调用"Process Create",然后调用"Thread Exit".

编辑3:我在可执行文件上启用了加载程序快照,并在从cdb运行它时得到了它,如果它有帮助:

...
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - ENTER: DLL name: api-ms-win-core-sysinfo-l1-2-1.dll.
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - INFO: DLL name api-ms-win-core-sysinfo-l1-2-1.dll was redirected to C:\WINDOWS\SYSTEM32\kernelbase.dll by SxS.
00c0:1200 @ 02106250 - LdrpFindOrMapDll - ENTER: DLL name: C:\WINDOWS\SYSTEM32\kernelbase.dll
00c0:1200 @ 02106250 - LdrpResolveDllName - ENTER: DLL name: C:\WINDOWS\SYSTEM32\kernelbase.dll
00c0:1200 @ 02106250 - LdrpResolveDllName - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDll - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlSetLastWin32Error" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlLeaveCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlEnterCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlInitializeCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlDeleteCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlQueryPerformanceCounter" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "LdrResolveDelayLoadedAPI" by name
00c0:1200 @ 02106250 - LdrpMergeNodes - INFO: Merging a cycle rooted at USER32.dll.
00c0:1200 @ 02106250 - LdrpMergeNodes - INFO: Adding cyclic module GDI32.dll.
(c0.1200): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -
ntdll!LdrInitShimEngineDynamic+0x330:
00007ffc`d68732e8 cc              int     3
0:000>
Run Code Online (Sandbox Code Playgroud)

Ali*_*her 6

您应该静态链接CRT.对于消费者应用程序,有很多场景导致特定DLL丢失或其配置拙劣.我是一个非常流行的Windows应用程序(每天数千次安装)的安装程序技术负责人,你不会相信常见的配置错误的Windows机器.在底部我会给出一个简短的清单.

通用CRT是一个好主意,但相对较新,并且它会有一段时间(可能很长一段时间),直到它被破坏,防止客户的PC启动.这应该是门槛:如果您的客户无法在没有DLL X的情况下登录,那么可以依赖它.

常见的奇怪状态:

  • MSI安装程序正在进行中:不知何故,Windows认为正在进行安装
  • COM数据库不一致:HKCU部分注册表是一个粗略的地方
  • 在那里缺少MSVC crts或预发布版本
  • Windows的预发布版本:我们猜测预发布的Windows更容易盗版.
  • 仍在sysprep中:OEM忘记密封机器配置.
  • 字体损坏:如果使用DirectWrite,则特别痛苦
  • 超频:文件系统缓冲区中的最终位翻转等于损坏的文件.


Han*_*ant 3

我可以检查一下修补程序

请记住,这不是一个修补程序,这一点非常重要。这是通过 Windows Update 自动提供的正常更新。所以你知道一个事实,这些机器没有得到维护。这当然是一个非常坏的消息,出现问题是可以预料的。

缺少 api-ms-win-crt-runtime-l1-1-0.dll

它是一个操作系统 DLL,通常随操作系统安装一起提供,从 Win7 开始。这应该可以缩小这些机器的问题范围,它们很可能会启动 XP。Vista 的胜算很小。XP 不再由 Microsoft 维护,因此缺少更新并不是巧合。

“目标平台版本”是 8.1,“平台工具集”是“Visual Studio 2015 (v140)”

没关系,但您需要在安装程序中仔细检查这一点,并拒绝在 XP 上安装。仍然可以以 XP 为目标,您必须将平台工具集设置更改为“v140_xp”。不确定社区版中是否提供该选项,如果是的话我会感到惊讶。

共有 41 个文件...

只有一个重要,ucrtbase.dll。其余的都是应该存在于 Windows 安装目录中的 api-ms-win*.dll 文件。它们包含在内,因此您仍然可以在 XP 和 Vista 上运行,您应该将它们部署到 c:\windows\system32 或 c:\windows\syswow64,具体取决于位数。请注意,您记录了 x64 目录,验证用户是否拥有 64 位版本的 Windows 是您必须在安装程序中仔细检查的另一件事。

应用程序无法正确启动(0xc0000142)。

即 STATUS_DLL_INIT_FAILED,您所依赖的 DLL 之一的 DllMain() 入口点返回 FALSE。非常坏的消息,不容易调试,并且你肯定不会尝试用 VS2015 解决这个问题,因为它不会在你的机器上失败。您需要打开加载程序快照,以便操作系统加载程序变得喋喋不休。访问存在此问题的机器当然是强制性的。

显然,这是通过安装更新​​解决的......

是的,我想说,是时候减少损失了。当他们故意不维护自己的机器或拒绝更新它时,没有人可以合理地期望您的应用程序能够正常工作。验证您的安装程序中是否存在 ucrtbase.dll,如果不存在,则停止安装并告诉他们首先更新其计算机。