将Q_DECLARE_METATYPE与可能多次加载的DLL一起使用

Tra*_*ian 6 c++ qt qt4

使用Qt 4.8和C++.我正在使用在运行时加载和卸载的应用程序插件.在应用程序的生命周期内,可以多次加载相同的插件.其中一个插件用于Q_DECLARE_METATYPE某些需要存储的类型QVariant.稍后重新加载插件时,旧声明仍指向现在卸载的库的原始内存空间.当Qt尝试QVariant从重新声明的元类型创建a时,这会导致访问冲突.我们已经处理了类似的问题qRegisterMetaType():我们在加载库时注册元类型,并在卸载库之前注销这些类型.不幸的是,在声明而不是注册元类型时,这似乎不是一个选项.

我们如何有效地处理多次加载和卸载声明元类型的库的情况?

iam*_*man 1

为了扩展 Kuba Ober 的答案,您需要在卸载 DLL 之前使用您的类型名称调用QMetaType::unregisterType()http://doc.qt.io/qt-4.8/qmetatype.html#unregisterType )来取消注册元类型。您应该能够在取消注册使用 注册的类型的同一位置取消注册声明的元类型qRegisterMetaType<T>。这应该使 Qt 元对象系统处于干净状态(至少就您卸载的插件而言),以便下次加载插件时,将生成新的元类型 ID。具体来说,当再次加载 DLL 时,Q_DECLARE_METATYPE宏将再次注册您的类型,这次使用新的metatype_id, 并且QVariant不应再给您带来访问冲突。