码迷,mamicode.com
首页 > 其他好文 > 详细

LoadLibrary 失败的解决

时间:2017-10-24 00:05:35      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:初始化   而且   main   开关   adl   遇到   二次   调试过程   free   

工作中遇到调用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 失败的解决

标签:初始化   而且   main   开关   adl   遇到   二次   调试过程   free   

原文地址:http://www.cnblogs.com/parkertang/p/7719611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!