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)
您应该静态链接CRT.对于消费者应用程序,有很多场景导致特定DLL丢失或其配置拙劣.我是一个非常流行的Windows应用程序(每天数千次安装)的安装程序技术负责人,你不会相信常见的配置错误的Windows机器.在底部我会给出一个简短的清单.
通用CRT是一个好主意,但相对较新,并且它会有一段时间(可能很长一段时间),直到它被破坏,防止客户的PC启动.这应该是门槛:如果您的客户无法在没有DLL X的情况下登录,那么可以依赖它.
常见的奇怪状态:
我可以检查一下修补程序
请记住,这不是一个修补程序,这一点非常重要。这是通过 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,如果不存在,则停止安装并告诉他们首先更新其计算机。
| 归档时间: |
|
| 查看次数: |
15967 次 |
| 最近记录: |