首页| 论坛| 消息

标题:动态库使用Qt的imageformats插件,导致Qt的动态库不能自动卸载
作者:nice-name
日期:2017-11-10 16:43
内容:

涉及到的两个程序
1. 一个不使用QT的exe程序,叫做without_qt.exe
2. 一个使用QT的dll,叫做with_qt.dll
在with_qt.dll中提供一个按钮叫做btn_ICO,点击这个按钮之后,使用QIcon类加载ico(或者png,svg)格式的图片,此时会导致qt自动加载imageformats目录下的插件,比如qico4.dll,qgif4.dll等
测试1:
1. without_qt.exe调用LoadLibrary,加载with_qt.dll,并调用with_qt.dll提供的接口创建一个窗口
2. 关闭窗口,通过FreeLibrary卸载with_qt.dll
3. 通过Process Explorer观察,会发现QtCore和QtGui会被卸载
测试2:
1. without_qt.exe调用LoadLibrary,加载with_qt.dll,并调用with_qt.dll提供的接口创建一个窗口
2. 点击按钮btn_ICO
3. 关闭窗口,通过FreeLibrary卸载with_qt.dll
4. 通过Process Explorer观察,会发现QtCore和QtGui,以及加载的qico4.dll,qgif4.dll等都不会被卸载
有大神知道QT的这个机制吗,以及如何让with_qt.dll卸载的时候把QT的库也都一起卸载了。


#1 [nice-name 11-17 09:23]
经过几天的查找资料,最后在StackOverFlow上找到了解决的方法,虽然不是很完美,但是也能暂时解决问题。
链接:https://stackoverflow.com/questions/36132995/unload-all-qt-dlls#
大体的意思是这个是QT官方设计就是让这些插件在进程结束时才释放,如果我们需要提前释放,只能自己Free了。

回复 发表
主题 版块