API-MS-WIN-CRT-STDIO,win2012提示

筆者今天幫客戶做的一臺(tái)WIN2012客戶安裝了自己的網(wǎng)站,但是安裝后發(fā)現(xiàn),客戶的軟件打不開。我是這么解決的:

1:我先百度搜API-MS-WIN-CRT-STDIO綠色版,在網(wǎng)站上下載綠色版放系統(tǒng)盤注冊(cè),但是發(fā)現(xiàn)解決不了。

2:我發(fā)現(xiàn)有網(wǎng)友說是補(bǔ)丁問題,我是按照這個(gè)方法解決的:

我的系統(tǒng)是Windows Server 2012 R2 Standard首先我是想要安裝SVN客戶端,然后系統(tǒng)讓我安裝Windows Server 2012 R2 安裝補(bǔ)丁KB2999226

思路:經(jīng)過網(wǎng)上查找資料安裝補(bǔ)丁KB2999226之前需要安裝KB2919355,安裝KB2919355之前必須安裝補(bǔ)丁KB2919442,一層一層的。

步驟:

1、下載補(bǔ)丁KB2919442;KB2919355;KB2999226

請(qǐng)百度查找相關(guān)文件上自行下載補(bǔ)丁,這里也有鏈接:

 

第一步補(bǔ)丁下載:https://support.microsoft.com/en-us/help/2919442/march-2014-servicing-stack-update-for-windows-8-1-and-windows-server-2

第二個(gè)補(bǔ)丁下載:https://support.microsoft.com/en-us/help/2919355/windows-rt-8-1-windows-8-1-windows-server-2012-r2-update-april-2014

第三個(gè)補(bǔ)丁下載:https://support.microsoft.com/en-us/help/2999226/update-for-universal-c-runtime-in-windows

2、首先安裝完成后KB2919442,立即重啟生效

3、接下來安裝KB2919355,立即重啟生效

4、最后安裝KB2999226,立即重啟生效

5、最后安裝圓滿成功,我的SVN客戶端也安裝完成。

 

通過這個(gè)完美解決,我也分享一些網(wǎng)上的資料:

因?yàn)樵诰W(wǎng)上看了很多解決方案,都沒有很好的解決。所以記錄一下這個(gè)問題的解決。

之前使用VS2013編譯出的程序,是沒有這個(gè)問題的。這個(gè)問題僅僅出現(xiàn)在VS2015編譯的程序上。

重新安裝了一個(gè)?Windows server 2008 R2的虛擬機(jī),然后安裝了vc_redist.exe(VC2015x64版本),運(yùn)行程序是沒有問題的。這個(gè)winserver2008的系統(tǒng)鏡像是下載的微軟原版的,所以這里猜測安裝win server 2012的服務(wù)器安裝的系統(tǒng)可能并不是完整的。

解決過程

通過在服務(wù)器上的C:\Windows\System32(64位系統(tǒng)System32下是64位dll,SysWOW64目錄下是32位dll)下搜索也沒有找到相關(guān)的dll文件。
根據(jù)網(wǎng)上的一些資料,解決的辦法就是安裝VC運(yùn)行時(shí)庫KB2999226補(bǔ)丁。這個(gè)方法我嘗試過了,但是沒有效果。微軟提供了WindowsUCRT.zip(Windows 10 通用 C 運(yùn)行時(shí) )下載,里面包含多個(gè)操作系統(tǒng)下的補(bǔ)丁。

既然上面的方法可能無法解決,那就先看看具體的依賴情況
使用VS2015自帶dumpbin查看依賴

  1. dumpbin /dependents uds_services.exe
  2. Microsoft (R) COFF/PE Dumper Version 14.00.24218.2
  3. Copyright (C) Microsoft Corporation. All rights reserved.
  4. Dump of file uds_services.exe
  5. File Type: EXECUTABLE IMAGE
  6. Image has the following dependencies:
  7. uds_module_foundation.dll
  8. KERNEL32.dll
  9. MSVCP140.dll
  10. WS2_32.dll
  11. MSWSOCK.dll
  12. VCRUNTIME140.dll
  13. api-ms-win-crt-stdio-l1-1-0.dll
  14. api-ms-win-crt-heap-l1-1-0.dll
  15. api-ms-win-crt-convert-l1-1-0.dll
  16. api-ms-win-crt-runtime-l1-1-0.dll
  17. api-ms-win-crt-string-l1-1-0.dll
  18. api-ms-win-crt-environment-l1-1-0.dll
  19. api-ms-win-crt-math-l1-1-0.dll
  20. api-ms-win-crt-locale-l1-1-0.dll
  21. Summary
  22. 5000 .data
  23. 1000 .gfids
  24. 5000 .pdata
  25. 1E000 .rdata
  26. 1000 .reloc
  27. 1000 .rsrc
  28. 49000 .text
  29. 1000 .tls

在我本機(jī)上搜索api-ms-win-crt相關(guān)的文件,發(fā)現(xiàn)在4處地方都有找到

  1. C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86\
  2. C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\
  3. C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\
  4. C:\Program Files (x86)\Mozilla Firefox\

使用PEtools工具,可以看到Mozilla Firefox目錄下的是VS2013編譯的版本,而我的程序是VS2015編譯的64位版本,所以使用的是C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\目錄下的文件。

將這幾處中的相關(guān)文件拷貝到程序目錄之后,重新運(yùn)行,還是有dll找不到的錯(cuò)誤。
把所有api-ms-win-crt-*...dll文件都拷貝之后,報(bào)如下錯(cuò)誤:
693958-20170512155327160-1294783801.png

因?yàn)橐呀?jīng)沒有dll找不到的問題了,所以對(duì)于這個(gè)問題就比較費(fèi)解了。因?yàn)?code>dumpbin并沒有找出所有依賴的dll(比如上面沒有找到api-ms-win-crt-utility-l1-1-0.dll,但這個(gè)是被依賴的)。
使用Dependecy Walker工具可以看出來,__stdio_common_vfprintf這個(gè)函數(shù)在api-ms-win-crt-stdio-l1-1-0.dll里面。
693958-20170512160827832-467315025.png

但是無法看出api-ms-win-crt-stdio-l1-1-0.dll依賴了那些項(xiàng)目。
所以考慮是不是還有dll沒有拷貝進(jìn)去。發(fā)現(xiàn)目錄下有ucrtbase.dll這個(gè)文件,感覺這應(yīng)該是所有這些dll的基礎(chǔ)依賴。把它拷貝進(jìn)去之后,便可以正常運(yùn)行了。
經(jīng)過試驗(yàn),這個(gè)問題的原因在于沒有成功安裝KB2999226補(bǔ)丁,有些系統(tǒng)這個(gè)補(bǔ)丁是安裝不上的。只要找到ucrtbase.dll這個(gè)文件,拷貝到程序目錄下就可以了。

因?yàn)橐慌_(tái)機(jī)器上同時(shí)按照VS2013VS2015編譯出的版本可能會(huì)有沖突,所以不適合把它拷貝到System32目錄(火狐就是自帶了)。
可以通過設(shè)置Path環(huán)境變量來設(shè)置加載的dll查找位置。因?yàn)?code>Windows下依賴的dll查找順序(Dynamic-Link Library Search Order)是最后一個(gè)從Path環(huán)境變量中查找的,從而可能導(dǎo)致找到的并不是你想要的。

  1. # 這里將dll放置在當(dāng)前路徑下的api-ms-win-crt目錄下
  2. set Path=%Path%;%cd%\api-ms-win-crt
  3. # 啟動(dòng)程序
  4. start program

補(bǔ)充
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx
Windows下dll默認(rèn)加載路徑順序如下:

  1. 應(yīng)用程序所在的目錄
  2. SetDllDirectory所設(shè)置的路徑,如果沒有設(shè)置,就是當(dāng)前工作路徑(GetCurrentDirectory)
  3. system目錄,可通過 GetSystemDirectory獲取。(通常是C:\Windows\system32)
  4. 16位系統(tǒng)的目錄。(16位程序使用的,通常是C:\Windows\system)
  5. Windows目錄,可通過GetWindowsDirectory獲取。(C:\Windows)
  6. PATH環(huán)境變量中指定的路徑。(PATH環(huán)境變量中路徑的搜索順序是在前面的優(yōu)先,且系統(tǒng)環(huán)境變量優(yōu)先于用戶環(huán)境變量)

可以在程序中使用SetDllDirectory來指定DLL加載的目錄,但SetDllDirectory的每一次調(diào)用都會(huì)替換掉之前調(diào)用的結(jié)果??梢允褂?code>AddDllDirectory來添加多個(gè)DLL加載路徑。

 

更多
  • 該日志由 于2021年04月27日發(fā)表在 未分類 分類下, 你可以發(fā)表評(píng)論,并在保留原文地址 及作者的情況下引用到你的網(wǎng)站或博客。
  • 本文鏈接: API-MS-WIN-CRT-STDIO,win2012提示 | 幫助信息-動(dòng)天數(shù)據(jù)
  • 版權(quán)所有: 幫助信息-動(dòng)天數(shù)據(jù)-轉(zhuǎn)載請(qǐng)標(biāo)明出處
  • 【上一篇】 【下一篇】

    0 Comments.

    發(fā)表評(píng)論