LoadLibrary 失败的解决

Posted 平平_淡淡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LoadLibrary 失败的解决相关的知识,希望对你有一定的参考价值。

工作中遇到调用Loadlibrary 偶发失败的问题,不是必现,而且这种错误只是在程序初始化的时候出现,初始化成功后当然不会调用,而初始化也不是经常做的动作,所以查找原因起来比较麻烦,调试过程中发现有两个方法把这个问题变成必现的问题,一个是加调试代码反复加载dll。

h=LoadLibrary(“A.dll”);

FreeLibrary(h);

h=LoadLibrary(“A.dll”);

FreeLibrary(h);

 

第二次loadlibrary就会失败!!!

 

还有个方法是程序运行时按急停开关,之后关闭程序后重新打开并初始化,这个时候很大可能会失败。

 

通过查资料,发现loadlibrary失败有几个原因:

1.文件路径不对

2.dll里有全局变量出事化失败或dllmain函数返回false。

我们这个程序里用的是绝对路径,原因1是不成立的。分析dll的代码,发现原因2也是不成立的。

追踪到这里就没思路解决问题了,后来发现加载dll可以用loadlibrary,loadlibraryex,afxloadlibrary。试了下其他两个函数,loadlibraryex现象一样,afxloadlibrary会抛异常。查了资料,afxloadlibrary是用来加载mfc扩展dll的,不同的一点是 在加载dll前会处理线程同步。好像初始化也没有线程同步的问题啊。不理解。

再仔细看代码,发现dllmain所在的类文件里有 #include <afxdllx.h> , 不理解这个头文件有什么作用,屏蔽后编译没影响,将dll放在必现的场景下测试,不再出现加载失败的问题。

大致算解决这个问题了,后续再追踪看看有没有彻底解决。

 

以上是关于LoadLibrary 失败的解决的主要内容,如果未能解决你的问题,请参考以下文章

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

如果使用 LoadLibrary 显式链接 dll,则列出从 PE 文件中导入的函数

LoadLibrary加载动态库失败

c#编程语言,win7下使用Kernel32的LoadLibrary方法载入DLL失败,如何解决?

vc++ loadlibrary dll路径问题

LoadLibrary 失败,错误代码为 14001