zoukankan      html  css  js  c++  java
  • 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() << "
    ";
     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() << "
    ";
     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
  • 相关阅读:
    字符串常量
    二维数组中的查找
    Codeforces 156B Suspects——————【逻辑判断】
    Codeforces 156 A——Message——————【思维题】
    Codeforces 639B——Bear and Forgotten Tree 3——————【构造、树】
    Codeforces 671 A——Recycling Bottles——————【思维题】
    Codeforces 550D —— Regular Bridge——————【构造】
    Codeforces 550C —— Divisibility by Eight——————【枚举 || dp】
    codeforces 638B—— Making Genome in Berland——————【类似拓扑排序】
    codeforces 675 C ——Money Transfers——————【思维题】
  • 原文地址:https://www.cnblogs.com/smartNeo/p/15163192.html
Copyright © 2011-2022 走看看