我有一个包含Qt GUI的dll,由“服务器”应用程序启动,在GUI被终止(卸载)后继续。
一切正常,但如果我重新启动GUI,则全部崩溃。如果我只运行一次并列出加载的dll,Qt5Core,Qt5Gui和qwindows.dll永远不会被卸载。
我认为我需要卸载它们(我的dll在专用线程中创建一个QApplication,正确销毁)
我在Windows 7上使用msvc2010编译器,没有日志(“常规保护错误”不是我的日志)。
是否有解除所有qt dll(Qtcore,QtGui,qwindows)的解决方案? (未明确调用“FreeLibrary”功能)
答案 0 :(得分:1)
我最近与Qt公司就同样的问题创建了一张支持票,并收到了令人失望的回复。在应用程序终止之前,有一个有意识的设计决定让Qt插件保持加载状态。因此,许多针对非Qt主机应用程序设计的基于Qt的插件将不得不采用简单的解决方法来确保正常运行。
当您卸载各种Qt DLL时,卸载顺序非常重要,因为许多DLL依赖于彼此。以下是我从Qt支持工程师那里收到的确切回复:
在应用程序之前,故意不卸载插件 终止,因为过去有卸载的问题 插件因此同意他们应该保持装载 应用程序的生命周期。你应该先卸载插件 在卸载自己的DLL之前。插件可以在任何插件中卸载 订购你想要的,因为他们不依赖于彼此,主要平台 one - qwindows.dll - 将是处理该问题的主要问题 事件等。所以只要QApplication不再运行 一个事件循环然后你应该能够安全地卸载它。只要 当你在Qt dll之前卸载插件然后清理它 插件会用仍然加载的Qt dll来完成 不应该导致崩溃。
答案 1 :(得分:0)
使用GetModuleHandle(&#34; dllname&#34;)解决,我得到句柄,可以使用freelibrary。现在工作正常=)(但不是真的&#34;动态&#34; ... Qt在调试和发布时使用不同的名称,如果另一个dll是&#34;浮动&#34;,我需要修改代码)< / p>
感谢您的帮助!