API-MS-WIN-CRT-STDIO,win2012提示
筆者今天幫客戶做的一臺WIN2012客戶安裝了自己的網站,但是安裝后發現,客戶的軟件打不開。我是這么解決的:
1:我先百度搜API-MS-WIN-CRT-STDIO綠色版,在網站上下載綠色版放系統盤注冊,但是發現解決不了。
2:我發現有網友說是補丁問題,我是按照這個方法解決的:
我的系統是Windows Server 2012 R2 Standard首先我是想要安裝SVN客戶端,然后系統讓我安裝Windows Server 2012 R2 安裝補丁KB2999226
思路:經過網上查找資料安裝補丁KB2999226之前需要安裝KB2919355,安裝KB2919355之前必須安裝補丁KB2919442,一層一層的。
步驟:
1、下載補丁KB2919442;KB2919355;KB2999226
請百度查找相關文件上自行下載補丁,這里也有鏈接:
第一步補丁下載:https://support.microsoft.com/en-us/help/2919442/march-2014-servicing-stack-update-for-windows-8-1-and-windows-server-2
第二個補丁下載:https://support.microsoft.com/en-us/help/2919355/windows-rt-8-1-windows-8-1-windows-server-2012-r2-update-april-2014
第三個補丁下載:https://support.microsoft.com/en-us/help/2999226/update-for-universal-c-runtime-in-windows
2、首先安裝完成后KB2919442,立即重啟生效
3、接下來安裝KB2919355,立即重啟生效
4、最后安裝KB2999226,立即重啟生效
5、最后安裝圓滿成功,我的SVN客戶端也安裝完成。
通過這個完美解決,我也分享一些網上的資料:
因為在網上看了很多解決方案,都沒有很好的解決。所以記錄一下這個問題的解決。
之前使用VS2013
編譯出的程序,是沒有這個問題的。這個問題僅僅出現在VS2015
編譯的程序上。
重新安裝了一個?Windows server 2008 R2
的虛擬機,然后安裝了vc_redist.exe
(VC2015x64版本),運行程序是沒有問題的。這個winserver2008的系統鏡像是下載的微軟原版的,所以這里猜測安裝win server 2012的服務器安裝的系統可能并不是完整的。
解決過程
通過在服務器上的C:\Windows\System32
(64位系統System32下是64位dll,SysWOW64目錄下是32位dll)下搜索也沒有找到相關的dll
文件。
根據網上的一些資料,解決的辦法就是安裝VC運行時庫
和KB2999226
補丁。這個方法我嘗試過了,但是沒有效果。微軟提供了WindowsUCRT.zip(Windows 10 通用 C 運行時 )
下載,里面包含多個操作系統下的補丁。
既然上面的方法可能無法解決,那就先看看具體的依賴情況
使用VS2015自帶dumpbin查看依賴
-
dumpbin /dependents uds_services.exe
-
Microsoft (R) COFF/PE Dumper Version 14.00.24218.2
-
Copyright (C) Microsoft Corporation. All rights reserved.
-
Dump of file uds_services.exe
-
File Type: EXECUTABLE IMAGE
-
Image has the following dependencies:
-
uds_module_foundation.dll
-
KERNEL32.dll
-
MSVCP140.dll
-
WS2_32.dll
-
MSWSOCK.dll
-
VCRUNTIME140.dll
-
api-ms-win-crt-stdio-l1-1-0.dll
-
api-ms-win-crt-heap-l1-1-0.dll
-
api-ms-win-crt-convert-l1-1-0.dll
-
api-ms-win-crt-runtime-l1-1-0.dll
-
api-ms-win-crt-string-l1-1-0.dll
-
api-ms-win-crt-environment-l1-1-0.dll
-
api-ms-win-crt-math-l1-1-0.dll
-
api-ms-win-crt-locale-l1-1-0.dll
-
Summary
-
5000 .data
-
1000 .gfids
-
5000 .pdata
-
1E000 .rdata
-
1000 .reloc
-
1000 .rsrc
-
49000 .text
-
1000 .tls
在我本機上搜索api-ms-win-crt
相關的文件,發現在4處地方都有找到
-
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86\
-
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\
-
C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\
-
C:\Program Files (x86)\Mozilla Firefox\
使用PEtools工具,可以看到Mozilla Firefox
目錄下的是VS2013
編譯的版本,而我的程序是VS2015
編譯的64位版本,所以使用的是C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\
目錄下的文件。
將這幾處中的相關文件拷貝到程序目錄之后,重新運行,還是有dll找不到的錯誤。
把所有api-ms-win-crt-*...dll
文件都拷貝之后,報如下錯誤:
因為已經沒有dll找不到的問題了,所以對于這個問題就比較費解了。因為dumpbin
并沒有找出所有依賴的dll
(比如上面沒有找到api-ms-win-crt-utility-l1-1-0.dll,但這個是被依賴的)。
使用Dependecy Walker
工具可以看出來,__stdio_common_vfprintf
這個函數在api-ms-win-crt-stdio-l1-1-0.dll
里面。
但是無法看出api-ms-win-crt-stdio-l1-1-0.dll
依賴了那些項目。
所以考慮是不是還有dll
沒有拷貝進去。發現目錄下有ucrtbase.dll
這個文件,感覺這應該是所有這些dll的基礎依賴。把它拷貝進去之后,便可以正常運行了。
經過試驗,這個問題的原因在于沒有成功安裝KB2999226
補丁,有些系統這個補丁是安裝不上的。只要找到ucrtbase.dll
這個文件,拷貝到程序目錄下就可以了。
因為一臺機器上同時按照VS2013
和VS2015
編譯出的版本可能會有沖突,所以不適合把它拷貝到System32
目錄(火狐就是自帶了)。
可以通過設置Path
環境變量來設置加載的dll
查找位置。因為Windows
下依賴的dll查找順序(Dynamic-Link Library Search Order)是最后一個從Path
環境變量中查找的,從而可能導致找到的并不是你想要的。
-
# 這里將dll放置在當前路徑下的api-ms-win-crt目錄下
-
set Path=%Path%;%cd%\api-ms-win-crt
-
# 啟動程序
-
start program
補充
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx
Windows下dll默認加載路徑順序如下:
- 應用程序所在的目錄
- SetDllDirectory所設置的路徑,如果沒有設置,就是當前工作路徑(GetCurrentDirectory)
- system目錄,可通過 GetSystemDirectory獲取。(通常是C:\Windows\system32)
- 16位系統的目錄。(16位程序使用的,通常是C:\Windows\system)
- Windows目錄,可通過GetWindowsDirectory獲取。(C:\Windows)
- PATH環境變量中指定的路徑。(PATH環境變量中路徑的搜索順序是在前面的優先,且系統環境變量優先于用戶環境變量)
可以在程序中使用SetDllDirectory
來指定DLL加載的目錄,但SetDllDirectory
的每一次調用都會替換掉之前調用的結果。可以使用AddDllDirectory
來添加多個DLL加載路徑。
0 Comments.