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

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

今天写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

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