查看完整版本: [-- 动态库使用Qt的imageformats插件,导致Qt的动态库不能自动卸载 --]

QTCN开发网 -> Qt基础编程 -> 动态库使用Qt的imageformats插件,导致Qt的动态库不能自动卸载 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

nice-name 2017-11-10 16:43

动态库使用Qt的imageformats插件,导致Qt的动态库不能自动卸载

涉及到的两个程序
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 2017-11-17 09:23
经过几天的查找资料,最后在StackOverFlow上找到了解决的方法,虽然不是很完美,但是也能暂时解决问题。
链接:https://stackoverflow.com/questions/36132995/unload-all-qt-dlls#

大体的意思是这个是QT官方设计就是让这些插件在进程结束时才释放,如果我们需要提前释放,只能自己Free了。


查看完整版本: [-- 动态库使用Qt的imageformats插件,导致Qt的动态库不能自动卸载 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled