• 3402阅读
  • 1回复

[提问]动态库使用Qt的imageformats插件,导致Qt的动态库不能自动卸载 [复制链接]

上一主题 下一主题
离线nice-name
 

只看楼主 倒序阅读 楼主  发表于: 2017-11-10
关键词: 插件卸载
涉及到的两个程序
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的库也都一起卸载了。
离线nice-name

只看该作者 1楼 发表于: 2017-11-17
经过几天的查找资料,最后在StackOverFlow上找到了解决的方法,虽然不是很完美,但是也能暂时解决问题。
链接:https://stackoverflow.com/questions/36132995/unload-all-qt-dlls#

大体的意思是这个是QT官方设计就是让这些插件在进程结束时才释放,如果我们需要提前释放,只能自己Free了。
快速回复
限100 字节
 
上一个 下一个