今天写VC loadlibrary()加载第三方dll时,总是失败,错误代码是126。在这里,我给大家分享一下具体的解决方案。
方式一: 采用 LoadLibraryEx
如果DLL不在调用者的同一个目录中,可以用LoadLibrary(L ' DLL ' DLL的绝对路径')加载。但是,如果在被调用的DLL内部调用另一个DLL,调用仍然会失败。解决方案是使用LoadLibraryEx:
LibraryEx ("DLL绝对路径",null,load _ with _ altered _ search _ path);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,系统DLL搜索序列从DLL所在的目录开始。
方式二: 采用 SetCurrentDir
跨目录调用dll。你应该这样做
用GetCurrentDir保存当前工作目录
使用SetCurrentDir将当前工作目录设置为DLL所在的路径。您需要使用绝对路径。
使用DLL加载库。
使用SetCurrentDir恢复到原始工作路径。
如下
TCHAR chCurDir[MAX _ PATH]={ 0 };
GetCurrentDirectory(MAX_PATH,chCurDir);
SetCurrentDirectory(_ T(' E:\ \ test \ '));
m _ hDLL=LoadLibrary(_ T(' mytest . dll '));
SetCurrentDirectory(chCurDir);
dll的加载顺序
EXE目录;
当前目录getCurrentDirectory();
系统目录getsystem directory();
WINDOWS目录getwindows directory();
环境变量PATH中包含的目录。
当使用loadlibrary加载dll使用的路径时,该函数将忽略该路径,只根据已建立的规则加载dll。所以如果要加载指定目录的dll,可以使用以上两种方案。
后续
最近又遇到一个126的问题,以上两种方法都解决不了。
问题描述:
Windows 64位系统,加载32位DLL,DLL加载路径为“C:\Windows\System32\xxx.dll”
解决方案:
将上面加载失败的DLL副本复制到“C:\ Windows \ syswow 64”;
在不改变程序的情况下,path参数仍然填充在‘C:\ Windows \ System32 \ XXX . dll’中;
解决问题!
原因:
简单来说,你可以从SysWOW64的全称中找到原因:
64位Windows上的2位Windows(64位Windows上的32位Windows)
详情请参考以下链接:
SysWow64是什么?
LoadLibraryW()无法在System32中加载DLL
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。