关于Qt solution中qtwinmigrate framework的一个bug

本文解析了TheWinMigrationframework中QMfcApp::pluginInstance在DllMain函数中的加载机制。当qApp为0时,会创建QApplication对象并重新加载DLL,增加拥有QApplication对象的DLL的引用计数,确保即使调用FreeLibrary也不被卸载。其他DLL将共享已存在的qApp实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。

在国外的一个论坛上找到的:

The WinMigration framework does the following behind the scenes when you
call QMfcApp::pluginInstance in your DllMain function for the ATTACH-case:


If qApp is still 0, then create a QApplication object, and load the DLL
again (based in the HINSTANCE parameter you pass in). This increase the
reference count of the DLL that owns the QApplication object - the DLL will
not be unloaded even if the application that explicitly loaded the DLL as a
plugin calls FreeLibrary (unless the application calls FreeLibrary more
often that it called LoadLibray, which is of course a bug in the
application).

Other DLLs loaded later will see that qApp already exists, and just share
that instance. Those DLLs will be unloaded by the application when it calls
FreeLibrary.

The DLL owning qApp will then be unloaded by the system when the process
exits. In that case, DllMain with DETACH will be called, and you can delete
qApp in your code (based on the return value of the call to pluginInstance
earlier).

All this should also work if you link against those DLLs rather than
LoadLibrary/FreeLibrary them yourself, as the system will free the DLLs
loaded during application startup in the opposite order of which they were
loaded.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值