VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法

 更新时间:2021年03月15日 11:08:58   作者:Long_Freedom  
今天在编写VC++ loadlibrary()加载三方dll是总是失败,并且返回错误码:126,这里就为大家分享一下具体的解决方法

方式一: 采用 LoadLibraryEx

若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx:
LoadLibraryEx(“DLL绝对路径”, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。

方式二: 采用 SetCurrentDir

跨目录调用dll,你应该这样

  1. 用GetCurrentDir保存当前的工作目录
  2. 用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
  3. 用LoadLibrary你的DLL
  4. 使用SetCurrentDir恢复到原来的工作路径

如下所示

TCHAR chCurDir[MAX_PATH] = {0}; 
GetCurrentDirectory(MAX_PATH, chCurDir); 
SetCurrentDirectory(_T("E:\\test\\")); 
m_hDLL = LoadLibrary(_T("MyTest.dll")); 
SetCurrentDirectory(chCurDir); 

dll的加载顺序

  1. EXE所在目录;
  2. 当前目录GetCurrentDirectory();
  3. 系统目录GetSystemDirectory();
  4. WINDOWS目录GetWindowsDirectory();
  5. 环境变量 PATH 所包含的目录。

使用loadlibrary加载dll使用的路径时,这个函数会忽略这个路径,只会按既定规则加载dll。所以如果要加载指定目录的dll,可以用上述两个解决方案。

后续

最近又遇到一个126的问题, 采用上述两种方式依然无法解决

问题描述:

Windows 64位系统, 加载32位dll, DLL加载路径为 “C:\Windows\System32\xxx.dll”
解决办法:
将上述加载失败的DLL, 复制一份到"C:\Windows\SysWOW64"下面;
程序不用更改, 路径参数依然填写"C:\Windows\System32\xxx.dll";
问题解决!

原因:

简单来说可以从SysWOW64的全称找到原因:
32bit Windows On 64bit Windows(在64位Windows上的32位Windows)

详情可参考以下链接:

什么是SysWow64

LoadLibraryW() failing to load DLL in System32

相关文章

  • C++实现LeetCode(144.二叉树的先序遍历)

    C++实现LeetCode(144.二叉树的先序遍历)

    这篇文章主要介绍了C++实现LeetCode(144.二叉树的先序遍历),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解QTreeWidget隐藏节点的两种方式

    详解QTreeWidget隐藏节点的两种方式

    本文主要介绍了QTreeWidget隐藏节点的两种方式,一种是直接隐藏,一种是间接隐藏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++多态的实现及原理详细解析

    C++多态的实现及原理详细解析

    C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数
    2013-09-09
  • C语言链表完整操作演示

    C语言链表完整操作演示

    这篇文章主要为大家详细介绍了C语言链表的完整操作演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • c++中的4种类型转化方式详细解析

    c++中的4种类型转化方式详细解析

    const_cast该函数用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量。反过来,也可以将一个非常量的指针变量转换为一个常指针变量
    2013-10-10
  • C++俄罗斯方块游戏 无需图形库的俄罗斯方块

    C++俄罗斯方块游戏 无需图形库的俄罗斯方块

    这篇文章主要为大家详细介绍了无需图形库的C++俄罗斯方块游戏,重温经典游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • C++入门语法之函数重载详解

    C++入门语法之函数重载详解

    这篇文章主要为大家详细介绍了C++入门语法之函数重载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C/C++中CONST用法总结(推荐)

    C/C++中CONST用法总结(推荐)

    这篇文章主要介绍了C/C++中CONST用法总结(推荐),包括const常量与define宏定义的区别介绍,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-07-07
  • C语言用函数实现电话簿管理系统

    C语言用函数实现电话簿管理系统

    这篇文章主要为大家详细介绍了C语言用函数实现电话簿管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C语言轻松实现扫雷小游戏

    C语言轻松实现扫雷小游戏

    扫雷是一款经典的小游戏,这篇文章主要为大家详细介绍了C语言轻松实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论