LoadLibrary动态加载dll失败,GetLastError返回错误码126
问题描述
使用::LoadLibrary(sdkFullPath)动态加载海康dll,加载失败,GetLastError返回错误码126。
原因分析
错误码126表示没有找到指定模块,但是::LoadLibrary的参数sdk路径是正确的。
解决方案
最后使用::LoadLibraryEx(sdkFullPath,NULL, LOAD_WITH_ALTERED_SEARCH_PATH),没有出现错误。
LoadLibraryEx参数说明
lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
LoadLibrary和LoadLibraryEx的区别
两个函数的主要区别是LoadLibraryEx多了个参数dwFlags,可以设定一些动态加载DLL时的选项。
一般来说,LoadLibraryEx加载DLL时并没有调用DLL,也就是不会执行DllMain,这样以来即使DLL本身存在错误也会映射成功的。
而LoadLibrary加载时不旦旦映射,还会去调用执行DllMain。
如果确认一个DLL本身不存在问题,但用LoadLibrary加载失败用LoadLibraryEx加载成功,此时一要看DllMain是否作出了某些限制,二要看DLL本身是否链接了其他DLL。
总结
还是没有太搞清楚使用LoadLibrary加载失败的详细原因,感觉是依赖的dll文件找不到,使用LoadLibraryEx可以遍历子目录找dll,所以成功了。
之后再看看这个问题,先放放,后续弄明白再更新。
参考
https://blog.csdn.net/cuglifangzheng/article/details/50580279