问题描述

最近用一台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这个文件,拷贝到程序目录下就可以了。

因为一台机器上同时按照VS2013VS2015编译出的版本可能会有冲突,所以不适合把它拷贝到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默认加载路径顺序如下:

  1. 应用程序所在的目录
  2. SetDllDirectory所设置的路径,如果没有设置,就是当前工作路径(GetCurrentDirectory)
  3. system目录,可通过 GetSystemDirectory获取。(通常是C:\Windows\system32)
  4. 16位系统的目录。(16位程序使用的,通常是C:\Windows\system)
  5. Windows目录,可通过GetWindowsDirectory获取。(C:\Windows)
  6. 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 解决的更多相关文章

  1. Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升

    亲测可用 1.无法启动此程序,因为计算机中丢失mfc42d.dll 我也遇到了这个问题,并且顺利解决了!按一下流程搞定的: “工程-设置-常规-microsoft基础类,(选择使用MFC作为静态链接库 ...

  2. 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll

    一.问题描述 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll 二.解决方法 首先进入 http://www.microsoft.com/zh-CN/download/det ...

  3. 无法启动此程序因为计算机中丢失 xxx.dll

    “无法启动此程序因为计算机中丢失 XXX.dll” 这类问题在 visual studio 中很常见… 许久不和VS打交道,一碰各种坑… 这是在 VS 2015 Community 出现的问题: (1 ...

  4. win7 无法启动此程序,因为计算机中丢失glut32.dll

    http://zhidao.baidu.com/link?url=9NZxqCvR7hvmKuVR1dUSdQB-TTv_re-g7lp-xZj5FKII04FnMvIKjFhKv299t6wv5Ht ...

  5. 在启动php时,无法启动此程序,由于计算机中丢失MSVCR110.dll的解决方法

    在启动php时,运行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,由于计算机中丢失MSVCR110.dll 方 ...

  6. 无法启动此程序,因为计算机中丢失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- ...

  7. 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 ...

  8. 无法启动此程序,因为计算机中丢失AdbWinApi.dll。尝试重新安装该程序以解决此问题

    第一次搭建android开发环境,装完adb以后,打开DOS验证安装是否成功:但输入adb logcat调试时,系统弹出以下异常的对话框: 无法启动此程序,因为计算机中丢失AdbWinApi.dll. ...

  9. 无法启动此程序,因为计算机中丢失MSVCP110.dll

    安装Visual C++ Redistributable for Visual Studio 2012 有arm.x86.x64有三个版本. 如果应用程序为debug版本而不是release版本,可能 ...

  10. 无法启动此程序因为计算机中丢失msvcr71

    http://jingyan.baidu.com/article/25648fc1abc4d69190fd0077.html       下面是msvcr文件下载地址: 链接:http://pan.b ...

随机推荐

  1. protobuf中的编码规则

    protobuf中的编码规则 (1)序列化和反序列化: 在开始本部分的内容之前,首先有必要介绍两个基本概念,一个是序列化,一个是反序列化.这两个概念的定义在网上搜一下都很多的,但大多都讲得比较晦涩,不 ...

  2. vmware桥接模式

    vmware桥接模式 桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于一 ...

  3. C#自带类库实现邮件发送

    1.首先引入命名空间using System.Net.Mail; 2.将发送的邮件的功能封装成一个类,该类中包含了发送邮件的基本功能:收件人(多人),抄送(多人),发送人,主题,邮件正文,附件等,封装 ...

  4. Swift3.0:Get/Post同步和异步请求

    一.介绍 Get和Post区别: Get是从服务器上获取数据,Post是向服务器发送数据. 对于Get方式,服务端用Request.QueryString获取变量的值,对于Post方式,服务端用Req ...

  5. 使用C++/libCurl/Jsoncpp读取arcgis wmts 服务(restful模式)

    前言: 最近工作需要将arcgis的wmts服务接入我们的3DGis系统平台,要求用户只输入一个rest模式的wmts服务地址,系统即可自动获取并解析其元数据信息,生成wmts图层,并渲染显示.经过多 ...

  6. PyTorch保存模型与加载模型+Finetune预训练模型使用

    Pytorch 保存模型与加载模型 PyTorch之保存加载模型 参数初始化参 数的初始化其实就是对参数赋值.而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了da ...

  7. centos6.8 mysql5.6.34 root密码重置

    1.关闭正在运行的MySQL service mysql stop 2.启动MySQL的安全模式 mysqld_safe --skip-grant-tables 等1分钟如果还没返回的话,新开shel ...

  8. Backbone.js 使用模板

    实际的应用中会使用到模板,Model 等,而模板又是进阶的基础.所以这里介绍在 View 中使用模板,以及如何向模板填充值,模板可以用字符串,或是用 <script type="tex ...

  9. Python3 使用 matplotlib 画折线图

    ChartUtil.py import matplotlib.pyplot as plt from pylab import mpl def plotLine(xData,yData,xLabel,c ...

  10. 介绍一些有趣的MySQL pager命令

    一.分页结果集 在Linux系统中中,我们经常也会使用一些分页查看命令,例如less.more等.同样,MySQL客户端也提供了类似的命令,用来帮助我们对查询结果集进行分页.比如,SHOW ENGIN ...