LoadLibrary加载动态库失败
【1】LoadLibrary加载动态库失败的可能原因以及解决⽅案:(1)dll动态库⽂件路径不对。此场景细分为以下⼏种情况:
1.1 ⽂件路径的确错误。⽐如:本来欲加载的是A⽂件夹下的动态库a.dll,但是经过仔细排查原因,发现a.dll动态库竟然被拷贝到B⽂件夹下去了。
若真遇到这种低级错误,建议你找个没⼈的墙⾓蹲下⽤⼩拇指逆时针划圈圈去吧。。。1.2 实参传值错误。⽐如:实参类型为LPCWTR,经常都会因为字符串转换导致实参事与愿违。⽹上的经验总结实例。某程序员经过⼀番周折后通过以下语句调⽤成功hDll = LoadLibrary(TEXT(\"user32.dll\"));
再经过⼀番百度google后发现,原来是字符格式惹的祸。
这⾥的LoadLibrary实际使⽤了LoadLibraryW⽽⾮LoadLibraryA,因此需要UNICODE字符串(宽字符串),⽽⾮窄字符串。 如下:#ifdef UNICODE
#define LoadLibrary LoadLibraryW#else
#define LoadLibrary LoadLibraryA#endif // !UNICODE
在C/C++代码中,直接使⽤\"\"定义的字符串为窄字节串,⽽windows头⽂件中提供的TEXT宏可以根据是否定义了UNICODE宏来⾃动选择字符串类型。
因此,利⽤TEXT宏使其⾃动选择了正确的字符集,dll调⽤成功。
(2)dll⾥有全局变量初始化失败或dllmain函数返回false。这种情况需要根据⾃⼰的业务代码具体分析排除与定位。(3)位进程调⽤了32位dll动态库的问题。微软公司的官⽅⽹站针对这个问题描述如下:
在位的windows系统中,⼀个位进程不能加载⼀个32位dll,同理⼀个32位进程也不能加载⼀个位dll。
如果您真都没有源码,只能如此“尴尬”的想正常运⾏,可以参见资料《位进程调⽤32位dll的解决⽅法 / 程序位化带来的问题和思考》(4)其他原因
4.1 LoadLibrary函数跟LoadLibraryEx函数装载dll的机制不⼀样,前者在装载dll遇到与该dll依赖的其他dll时会⾃动装载,⽽后者不会。⽹上有加载⾃⼰的dll⽆法成功的例⼦,排除路径问题的话(最好全路径),就要考虑该dll是否依赖到其它的dll。
Good Good Study, Day Day Up.顺序 选择 循环 总结