问题描述

使用::LoadLibrary(sdkFullPath)动态加载海康dll,加载失败,GetLastError返回错误码126。

原因分析

错误码126表示没有找到指定模块,但是::LoadLibrary的参数sdk路径是正确的。

解决方案

最后使用::LoadLibraryEx(sdkFullPath,NULL, LOAD_WITH_ALTERED_SEARCH_PATH),没有出现错误。

LoadLibraryEx参数说明

lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序

hFile Long,未用,设为零
dwFlags Long,指定下述常数的一个或多个
DONT_RESOLVE_DLL_REFERENCES:不对DLL进行初始化,仅用于NT
LOAD_LIBRARY_AS_DATAFILE:不准备DLL执行。如装载一个DLL只是为了访问它的资源,就可以改善一部分性能
LOAD_WITH_ALTERED_SEARCH_PATH:指定搜索的路径

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

https://zhidao.baidu.com/question/204625991052212405.html

https://baike.baidu.com/item/LoadLibraryEx/9598009

版权声明:本文为huangsitao1024原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/huangsitao1024/p/10174034.html