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