最近新寫的程序要作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