最近新写的程序要做beta测试,在做绿色版(免安装版)时遇到了问题,vs2015做的项目本以为像之前的vs版本一样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边即可,然并卵。。。,在win7的测试机上还会提示找不到这个dll:api-ms-win-crt-runtime-l1-1-0.dll,如下图
继续找到这个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,而且这也背离了绿色版的初衷,继续研究吧。
后来注意到api-ms-win-crt-runtime-l1-1-0.dll同目录下有一堆api-xxx的dll,可能都是有联系的,索性整个目录所有dll全都拷到exe旁了,竟然可以启动了 O(∩_∩)O
注意:我用的是win10 sdk中的dll,具体目录在C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86 ,不同机器目录可能略有不同。另外我的程序是32位,所以是x86文件夹的,如果是64位等可以用Windows Kits\10\Redist\ucrt\DLLs下的对应文件夹的dll。
仔细一看拷过去的dll中还有一个叫ucrtbase.dll,难道和入口点那个报错有关系,删了后确实又报第二个截图的错误了。。。好坑爹呀,为什么别人都是报丢失dll,就你是报找不到入口点呢(而且还是另一个已存在的dll),害得我纠结了这么久,不管怎么样终于找到制作vs2015程序绿色版的正确姿势了——除了以往的msvc运行时库的多个dll外,还要把win10通用crt相关的多个dll都放到exe旁才可以。
后记:用procexp又看了下绿色版程序在win10机器上加载dll的列表,竟然没有api-xxx那堆dll,一个都没有,看来那些dll确实只是用于其他系统运行win10通用crt程序的,win10本身因为做了原生支持所以就不需要加载那些dll了。