LoadLibrary錯誤碼126


  在windows系統上使用C/C++開發,使用微軟提供的LoadLibrary API動態加載動態庫。在使用的時候加載動態庫句柄為空,錯誤碼為:126。下面對錯誤的出現原因和解決方式進行說明。

一、LoadLibrary錯誤碼126

       在MSDN上126錯誤碼的錯誤信息是:

       

       最初我把錯誤碼2和126弄混淆了,在MSDN上2錯誤碼的錯誤信息是:

      

      它們都是因為“找不到”而出現加載錯誤,但是錯誤碼2是找不到指定的“文件”,錯誤碼126是找不到指定的“模塊”。

     1.1.LoadLibrary加載的動態庫文件不存在

 1 int main()
 2 {
 3     constexpr auto kDll = LR"(dependence1.dll)";
 4 
 5     auto hModule = ::LoadLibraryW(kDll);
 6     if (hModule == NULL) {
 7         cerr << "LoadLibrary failed. error : " << ::GetLastError() << "\n";
 8     } 
 9 
10     return 0;
11 }

  

       動態庫文件不存在,返回的錯誤碼是126,並不是錯誤碼2。

     1.2.LoadLibrary加載的動態庫文件存在

 1 int main()
 2 {
 3     constexpr auto kDll = LR"(dependence1.dll.dll)";
 4 
 5     auto hModule = ::LoadLibraryW(kDll);
 6     if (hModule == NULL) {
 7         cerr << "LoadLibrary failed. error : " << ::GetLastError() << "\n";
 8     } 
 9 
10     return 0;
11 }

     

     這里dependence1.dll.dll文件是存在的,但是還是加載失敗。這到底是什么原因呢?

二、問題原因

     針對第一種情況,容易定位到的;但是針對第二種情況(也是第一種的復雜情況),需要使用一些方法進行定位。

    2.1.使用dumpbin或其他工具查看動態庫依賴的其他動態庫:

       

       對於小型或依賴庫不多的項目,使用這一步就可以定位到是那個或哪些庫文件不存在。但是對於大型或依賴大量的第三分庫(有些庫具體安裝在什么地方也可能不清楚),只通過這一個方式往往非常耗時耗力。

   2.2.使用Process Monitor工具監視指定的進程

     

     

     這個工具可以監視進程查找動態庫過程的詳細信息,而這里例子是缺少dependence2.dll.dll庫導致的。在測試或生產環境中,往往需要理論結合實踐的方式,解決類似的問題。

參考:

  • https://stackoverflow.com/questions/14361992/dll-load-library-error-code-126
  • https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
  • https://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM