无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决
问题描述
最近用一台Windows Server 2012 R2系统的机器的时候碰到了这个问题。

因为在网上看了很多解决方案,都没有很好的解决。所以记录一下这个问题的解决。
之前使用VS2013编译出的程序,是没有这个问题的。这个问题仅仅出现在VS2015编译的程序上。
重新安装了一个 Windows server 2008 R2的虚拟机,然后安装了vc_redist.exe(VC2015x64版本),运行程序是没有问题的。这个winserver2008的系统镜像是下载的微软原版的,所以这里猜测安装win server 2012的服务器安装的系统可能并不是完整的。
解决过程
通过在服务器上的C:\Windows\System32(64位系统System32下是64位dll,SysWOW64目录下是32位dll)下搜索也没有找到相关的dll文件。
根据网上的一些资料,解决的办法就是安装VC运行时库和KB2999226补丁。这个方法我尝试过了,但是没有效果。微软提供了WindowsUCRT.zip(Windows 10 通用 C 运行时 )下载,里面包含多个操作系统下的补丁。
既然上面的方法可能无法解决,那就先看看具体的依赖情况
使用VS2015自带dumpbin查看依赖
dumpbin /dependents uds_services.exe
Microsoft (R) COFF/PE Dumper Version 14.00.24218.2
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file uds_services.exe
File Type: EXECUTABLE IMAGE
Image has the following dependencies:
uds_module_foundation.dll
KERNEL32.dll
MSVCP140.dll
WS2_32.dll
MSWSOCK.dll
VCRUNTIME140.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-convert-l1-1-0.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-string-l1-1-0.dll
api-ms-win-crt-environment-l1-1-0.dll
api-ms-win-crt-math-l1-1-0.dll
api-ms-win-crt-locale-l1-1-0.dll
Summary
5000 .data
1000 .gfids
5000 .pdata
1E000 .rdata
1000 .reloc
1000 .rsrc
49000 .text
1000 .tls
在我本机上搜索api-ms-win-crt相关的文件,发现在4处地方都有找到
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86\
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\
C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\
C:\Program Files (x86)\Mozilla Firefox\
使用PEtools工具,可以看到Mozilla Firefox目录下的是VS2013编译的版本,而我的程序是VS2015编译的64位版本,所以使用的是C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\目录下的文件。
将这几处中的相关文件拷贝到程序目录之后,重新运行,还是有dll找不到的错误。
把所有api-ms-win-crt-*...dll文件都拷贝之后,报如下错误:

因为已经没有dll找不到的问题了,所以对于这个问题就比较费解了。因为dumpbin并没有找出所有依赖的dll(比如上面没有找到api-ms-win-crt-utility-l1-1-0.dll,但这个是被依赖的)。
使用Dependecy Walker工具可以看出来,__stdio_common_vfprintf这个函数在api-ms-win-crt-stdio-l1-1-0.dll里面。

但是无法看出api-ms-win-crt-stdio-l1-1-0.dll依赖了那些项目。
所以考虑是不是还有dll没有拷贝进去。发现目录下有ucrtbase.dll这个文件,感觉这应该是所有这些dll的基础依赖。把它拷贝进去之后,便可以正常运行了。
经过试验,这个问题的原因在于没有成功安装KB2999226补丁,有些系统这个补丁是安装不上的。只要找到ucrtbase.dll这个文件,拷贝到程序目录下就可以了。
因为一台机器上同时按照VS2013和VS2015编译出的版本可能会有冲突,所以不适合把它拷贝到System32目录(火狐就是自带了)。
可以通过设置Path环境变量来设置加载的dll查找位置。因为Windows下依赖的dll查找顺序(Dynamic-Link Library Search Order)是最后一个从Path环境变量中查找的,从而可能导致找到的并不是你想要的。
# 这里将dll放置在当前路径下的api-ms-win-crt目录下
set Path=%Path%;%cd%\api-ms-win-crt
# 启动程序
start program
补充
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx
Windows下dll默认加载路径顺序如下:
- 应用程序所在的目录
- SetDllDirectory所设置的路径,如果没有设置,就是当前工作路径(GetCurrentDirectory)
- system目录,可通过 GetSystemDirectory获取。(通常是C:\Windows\system32)
- 16位系统的目录。(16位程序使用的,通常是C:\Windows\system)
- Windows目录,可通过GetWindowsDirectory获取。(C:\Windows)
- PATH环境变量中指定的路径。(PATH环境变量中路径的搜索顺序是在前面的优先,且系统环境变量优先于用户环境变量)
可以在程序中使用SetDllDirectory来指定DLL加载的目录,但SetDllDirectory的每一次调用都会替换掉之前调用的结果。可以使用AddDllDirectory来添加多个DLL加载路径。
可参考:http://www.cnblogs.com/tocy/p/windows_dll_searth_path.html
无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决的更多相关文章
- Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升
亲测可用 1.无法启动此程序,因为计算机中丢失mfc42d.dll 我也遇到了这个问题,并且顺利解决了!按一下流程搞定的: “工程-设置-常规-microsoft基础类,(选择使用MFC作为静态链接库 ...
- 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll
一.问题描述 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll 二.解决方法 首先进入 http://www.microsoft.com/zh-CN/download/det ...
- 无法启动此程序因为计算机中丢失 xxx.dll
“无法启动此程序因为计算机中丢失 XXX.dll” 这类问题在 visual studio 中很常见… 许久不和VS打交道,一碰各种坑… 这是在 VS 2015 Community 出现的问题: (1 ...
- win7 无法启动此程序,因为计算机中丢失glut32.dll
http://zhidao.baidu.com/link?url=9NZxqCvR7hvmKuVR1dUSdQB-TTv_re-g7lp-xZj5FKII04FnMvIKjFhKv299t6wv5Ht ...
- 在启动php时,无法启动此程序,由于计算机中丢失MSVCR110.dll的解决方法
在启动php时,运行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,由于计算机中丢失MSVCR110.dll 方 ...
- 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll已解决
问题 : 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll 解决 1, 首先把C:\Windows\SysWOW64\的api-ms-win-crt- ...
- windows操作报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll
在Windows上做提交svn操作时报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll,如下图: 解决办法: 在 https://cn ...
- 无法启动此程序,因为计算机中丢失AdbWinApi.dll。尝试重新安装该程序以解决此问题
第一次搭建android开发环境,装完adb以后,打开DOS验证安装是否成功:但输入adb logcat调试时,系统弹出以下异常的对话框: 无法启动此程序,因为计算机中丢失AdbWinApi.dll. ...
- 无法启动此程序,因为计算机中丢失MSVCP110.dll
安装Visual C++ Redistributable for Visual Studio 2012 有arm.x86.x64有三个版本. 如果应用程序为debug版本而不是release版本,可能 ...
- 无法启动此程序因为计算机中丢失msvcr71
http://jingyan.baidu.com/article/25648fc1abc4d69190fd0077.html 下面是msvcr文件下载地址: 链接:http://pan.b ...
随机推荐
- 连接sqlServer数据库&jpa调用存储过程Java获取存储过程返回的多个结果集JAVA调用sqlserver存储过程的实现(返回多个结果集的实现)jdbc多结果集(getMoreResults)
存储过程: BEGIN select * from teacher; SELECT * FROM student; END public Object GetMyBOProjectProductLis ...
- 动态SQL(章节摘要)
1,使用动态SQL能够在依赖对象不存在时创建子程序. 2.动态SQL主要利用EXECUTE IMMEDIATE语句运行DML,DDL,DCL等语句操作. 3,假设使用了绑定变量,则必须在EXECUTE ...
- iOS: 获取UITableViewCell上添加的子控件对应的cell
一.简单介绍 UITableViewCell是UITableView的核心部分,我们在开发中因为功能的扩展经常需要自定义,以便在其上面添加子控件,例如button.label等.添加后获取这些子控件的 ...
- IIS7.5配置Gzip压缩解决方案(转)
开启配置HTTP压缩(GZip) 在IIS7中配置Gzip压缩相比IIS6来说实在容易了许多,而且默认情况下就是启用GZip压缩的.如果没有,则可以再功能视图下找到“压缩”项,进入之后就会看到“静态内 ...
- "Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased."
用一个普通的域帐号玩私有云的时候,遇到了如下的报错. "Your computer could not be joined to the domain. You have exceeded ...
- 利用wsdl2java工具生成webservice的客户端代码
1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME ...
- Tensorflow动态seq2seq使用总结(r1.3)
https://www.jianshu.com/p/c0c5f1bdbb88 动机 其实差不多半年之前就想吐槽Tensorflow的seq2seq了(后面博主去干了些别的事情),官方的代码已经抛弃原来 ...
- CRF分词的纯Java实现
与基于隐马尔可夫模型的最短路径分词.N-最短路径分词相比,基于随机条件场(CRF)的分词对未登录词有更好的支持.本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用 ...
- 无法从“void (__thiscall CtestDlg::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
按照孙鑫的教程添加自定义消息时,如果是VC6.0开发环境,也许没有什么 问题,但在VS2008中编译会报错的 无法从"void (__thiscall CtestDlg::* )(voi ...
- Web.config的Release版本和Debug版本不一样的奥秘
VS编译完后,release版本的web.config(或者app.config) 为什么不一样那? 我们查看一下项目结构,会发现有两个版本的config文件存在: 打开web.Debug.con ...