日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决

發布時間:2023/12/31 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

最近用一臺Windows Server 2012 R2系統的機器的時候碰到了這個問題。

因為在網上看了很多解決方案,都沒有很好的解決。所以記錄一下這個問題的解決。

之前使用VS2013編譯出的程序,是沒有這個問題的。這個問題僅僅出現在VS2015編譯的程序上。

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

解決過程

通過在服務器上的C:WindowsSystem32(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 Kits10RedistucrtDLLsx86
C:Program Files (x86)Windows Kits10RedistucrtDLLsx64
C:Program Files (x86)Microsoft Visual StudioInstalleresourcesappServiceHubServicesMicrosoft.VisualStudio.Setup.Service
C:Program Files (x86)Mozilla Firefox

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

將這幾處中的相關文件拷貝到程序目錄之后,重新運行,還是有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這個文件,拷貝到程序目錄下就可以了。

因為一臺機器上同時按照VS2013VS2015編譯出的版本可能會有沖突,所以不適合把它拷貝到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:Windowssystem32)
16位系統的目錄。(16位程序使用的,通常是C:Windowssystem)
Windows目錄,可通過GetWindowsDirectory獲取。(C:Windows)
PATH環境變量中指定的路徑。(PATH環境變量中路徑的搜索順序是在前面的優先,且系統環境變量優先于用戶環境變量)

可以在程序中使用SetDllDirectory來指定DLL加載的目錄,但SetDllDirectory的每一次調用都會替換掉之前調用的結果。可以使用AddDllDirectory來添加多個DLL加載路徑。
可參考:http://www.cnblogs.com/tocy/p/windows_dll_searth_path.html

總結

以上是生活随笔為你收集整理的无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。