好像有点难:DLL _unloaded 问题

亮亮视界 2009-03-01 03:56:51

以下是对问题的描述,希望各位能给出可能导致该问题的原因。
比如1我的程序写的可能有问题 2 驱动问题
希望大家能给的更详细一点。在此先谢了。
********************************************************************************
主要涉及到两个DLL,这两个DLL都是Intel的,安装某驱动时安装上的,该驱动Intel正在开发过程中,现在使用的只是一个中间的版本。暂且以A.dll 和B.dll代替。
我需要用到A.dll中函数,而A.dll中的函数需要用到B.dll
现象:
1LoadLibray(_T("A"));使用GetModuleHandle(_T("B"));可知在加载A的时候,B也被加载到内存。
2GetProcAddress获得A中的函数
3调用A中的函数
4使用GetModuleHandle(_T("B"));可得B.dll仍然存在于内存中。然后调用FreeLibrary(_T("A"));
程序崩溃出现下面提示:(日文操作系统)
問題の署名:
問題イベント名: APPCRASH
アプリケーション名: XXX.exe
アプリケーションのバージョン: 1.0.0.301
アプリケーションのタイムスタンプ: 49a7c175
障害モジュールの名前: B.dll_unloaded (A内部调用的dll)
障害モジュールのバージョン: 0.0.0.0
障害モジュールのタイムスタンプ: 496c6b1a
例外コード: c0000005
.......
.......


现象2:如果LoadLibray(_T("A"));调用其中的函数,然后LoadLibray(_T("B"));然后再释放A,这时候程序正常执行,A被成功释放,但B会仍存在于内存之中,此时释放B,程序仍然会崩溃。
现象3:如果LoadLibray(_T("A"));然后FreeLibrary(_T("A"));不调用A.dll中的函数,程序正常。
***********************************************************************************

...全文
505 点赞 收藏 12
写回复
12 条回复
wanglcho_cn 2009年03月02日
是的你在检查一下调用约定,看看函数的定义,虽然觉得可能行不大,应为load或free后可以成功

如果还有事件,消息回调,可能要清楚后,或结束后释放,或者有特殊事件,消息支持
回复 点赞
野男孩 2009年03月01日
多半是动态库设计的问题吧。

动态加载动态库,用GetProcAddress来查找函数地址来调用的,需要注意的就是调用约定。其他就没啥了。
回复 点赞
亮亮视界 2009年03月01日
[Quote=引用 7 楼 oyljerry 的回复:]
可以咨询一下intel等,^_^,workaround的话,就不要FreeLibrary好了,等到进程退出
[/Quote]
咨询中。。。
回复 点赞
亮亮视界 2009年03月01日
[Quote=引用 5 楼 wanglcho_cn 的回复:]
1.a没有在你释放时自动释放b,
你调用a函数后,先释放b再释放a,试试
2.估计是a的函数中增加了b的计数

3.如果a,b相互嵌套调用建议换个方案

4.查下函数使用有没有特殊要求
[/Quote]
1 试过,程序直接崩
2 如果只是增加了计数,释放的时候只是减少计数,应该不会出现问题阿,我如果再Load B一次就不出现该问题了。
3 B是A的内部实现,估计应该不会嵌套调用吧,假如是的话,释放的时候会先释放哪个dll呢
4 看了N遍,回调需要反回调,Open需要Close.
回复 点赞
亮亮视界 2009年03月01日
[Quote=引用 4 楼 oyljerry 的回复:]
直接单独LoadLibrary加载B.DLL,然后FreeLibrary看是否有问题等,,
[/Quote]
程序正常,没有问题。
回复 点赞
oyljerry 2009年03月01日
可以咨询一下intel等,^_^,workaround的话,就不要FreeLibrary好了,等到进程退出
回复 点赞
亮亮视界 2009年03月01日
我也怀疑是程序的问题,但initial和Uninitial我都是照着Intel文档中的流程进行操作的,我实在看不出有什么问题。也许只有参数问题了。即使是它的问题,我也想找个避免的方法。但还是想调用FreeLibrary,不想让它在不需要的时候还存在于内存之中。
回复 点赞
wanglcho_cn 2009年03月01日
1.a没有在你释放时自动释放b,
你调用a函数后,先释放b再释放a,试试
2.估计是a的函数中增加了b的计数

3.如果a,b相互嵌套调用建议换个方案

4.查下函数使用有没有特殊要求
回复 点赞
oyljerry 2009年03月01日
直接单独LoadLibrary加载B.DLL,然后FreeLibrary看是否有问题等,,
回复 点赞
oyljerry 2009年03月01日
DLL b的问题,可能卸载的时候有问题...
回复 点赞
cnzdgs 2009年03月01日
当然,也有可能是你不清楚这个DLL中函数调用的方法,例如需要按顺序调用某些函数后才可以卸载,不过即使是这样,也是DLL设计不妥。
回复 点赞
cnzdgs 2009年03月01日
显然是DLL的问题。
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7890

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告