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

(0)

相关推荐

  • 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所在目录开始

  • php curl返回错误码60如何解决

    今天有用户调用一个curl方法时,遇到如下的错误,查找了一些资料终于解决了.解决方法记录一下,留着自己以后自已查阅用. 错误代码 cURL error 60: SSL certificate problem: unable to get local issuer certificate 自定义接管错误输出后,可能如下显示 cURL error 60 错误 curl code ERROR 60错误 错误原因 curl 配置中开启了证书校验 就是使用了以下配置 curl_setopt($ch, CU

  • easyui combotree加载静态数据问题(选不上)解决方法

    在今天的开发中遇到一个奇怪的问题.虽然已经被我解决但还是百思不得其解,决定记录一下,看看有没有大神能给我答案. 问题重现: 由于我有4个combotree需要加载数据,但是我又不想每次初始化一个combotree就去访问服务器加载一下数据,于是我将加载数据过程写成这样 $.post('xxxurl',function(data){ $('#inputTree0').combotree('loadData',data); $('#inputTree1').combotree('loadData',

  • 动态加载iframe时get请求传递中文参数乱码解决方法

    当用户的页面需要动态加载iframe 时, 如果iframe的src中包传中文参数会出现编码错误:必须加编码,然后再解码. 编码:encodeURI(encodeURI("包含中文的串")) 解码:java.net.URLDecoder.decode("需要解码的串","utf-8"); 解决方案 使用 encodeURI('中文') 进行编码操作, js代码: 复制代码 代码如下: $(function() { $('#frame').attr

  • c#动态加载卸载DLL的方法

    c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法.在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的.也就是说,如果需要对动态加载的dll程序集进行更新,可以通过以下方法解决: 新建一个应用程序域,在该应用程序域中动态加载DLL,然后可以卸载掉该应用程序域.该应用程序域被卸载的时候,相关资源也会被回收. 要想这样实现,就要让你程序的currentDomain和新建的newDomain之间进行通信,穿过应用程

  • BootStrap下的弹出框加载select2框架失败的解决方法

    bootstrap下的弹出框加载select2框架失败的解决方案如下所示: $("#modal").on("shown.bs.modal", function(){ //等待弹出框弹出后再渲染select2控件 $("#select2").select2({ //再次渲染父界面后才能够加载出来数据. dropdownParent:$("#mpu_chart"), placeholder: '请选择变量', data:mpuKe

  • 无法加载php_curl.dll解决办法

    可是启动Apache的时候还是提示无法加载php_curl.dll这个文件,而且ext这个目录下面也有php_curl.dll这个文件,可是为什么就是找不到呢,真是百思不得其解. 然后就上google上去查,网上的资料都是说extension_dir的路径没有配置或是没有打开extension=php_curl.dll,可问题是我已经把前面的分号给去掉了. 后来看到一篇文章,问题终于解决了:原因是并不是所有的dll文件直接打开就可以了,有的是要依赖一些文件的,比如这个php_curl.dll就依

  • windows服务器下IIS6/7下PHP 无法加载 php_curl.dll 等动态链接库

    问题: PHP 在 IIS6 或 IIS7 中无法加载 php_curl.dll 动态链接库. 解决方法: 在PHP手册中有相关说明:php_curl.dll:CURL,客户端 URL 库函数库:需要:libeay32.dll,ssleay32.dll(已附带) 所以只要将 libeay32.dll,ssleay32.dll 这两个库复制到 %WINDOWS% 目录下即可. PS:网上有很多人说将以上两个库复制到 %SYSTEM32%,而这完全不起作用,文章只会COPY,又不经考证,简直就是误人

  • Linux程序运行时加载动态库失败的解决方法

    Linux下不能加载动态库问题 当出现下边异常情况 ./test: error while loading shared libraries: libmfs_open.so: cannot open shared object file: No such file or directory 若动态库的路径在(/usr/cluster/.share/lib) 解决办法: 方法一.在/etc/ld.so.conf文件中添加路径,vi /etc/ld.so.conf 添加下边内容 include ld

  • 解决Django加载静态资源失败的问题

    Django项目中为什么会加载静态时会失败呢? 原因:django部署方式比较特别,采用静态文件路径:STATICFILES_DIRS的部署方式,之前你写的相对路径,绝对路径因为缺少静态文件路径而全部失效 做页面显示时,肯定少不了加载css,js等文件吧,但是在Django中,我们的这些文件应该放在哪里呢?又该如何来配置? 1.Django中有静态文件(static)文件夹 2.配置相关文件 在settings.py文件中 STATIC_URL = '/static/' #添加这段代码 STAT

随机推荐