最近新写的程序要作beta测试,在作绿色版(免安装版)时遇到了问题,vs2015作的项目本觉得像以前的vs版本同样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边便可,然并卵。。。,在win7的测试机上还会提示找不到这个dll:api-ms-win-crt-runtime-l1-1-0.dll,以下图api
继续找到这个dll拷到exe旁,坑爹的一幕发生了,居然提示刚才拷贝的这个dll有问题——没法定位程序输入点ucrtbase.terminate。。。测试
难道是版本不对,我机器上是有几个不一样大小的api-ms-win-crt-runtime-l1-1-0.dll,都试了下,仍是不行,这就没处说理了。。。而后谷歌了下,都是说要装vs2015 Redistributable或者KB2999226的更新(Win10通用CRT,不是win10的,是其余win7等系统的更新用来支持通用crt的程序),试着装了下Redistributable包居然装到一半报未定义的错误(0x80240017)。。。O(≧口≦)O,并且这也背离了绿色版的初衷,继续研究吧。spa
后来注意到api-ms-win-crt-runtime-l1-1-0.dll同目录下有一堆api-xxx的dll,可能都是有联系的,索性整个目录全部dll全都拷到exe旁了,居然能够启动了 O(∩_∩)O
blog
注意:我用的是win10 sdk中的dll,具体目录在C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86 ,不一样机器目录可能略有不一样。另外个人程序是32位,因此是x86文件夹的,若是是64位等能够用Windows Kits\10\Redist\ucrt\DLLs下的对应文件夹的dll。it
仔细一看拷过去的dll中还有一个叫ucrtbase.dll,难道和入口点那个报错有关系,删了后确实又报第二个截图的错误了。。。好坑爹呀,为何别人都是报丢失dll,就你是报找不到入口点呢(并且仍是另外一个已存在的dll),害得我纠结了这么久,无论怎么样终于找到制做vs2015程序绿色版的正确姿式了——除了以往的msvc运行时库的多个dll外,还要把win10通用crt相关的多个dll都放到exe旁才能够。table
后记:用procexp又看了下绿色版程序在win10机器上加载dll的列表,居然没有api-xxx那堆dll,一个都没有,看来那些dll确实只是用于其余系统运行win10通用crt程序的,win10自己由于作了原生支持因此就不须要加载那些dll了。sdk