今天写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:WindowsSystem32xxx.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