将 Qt 4.8 与 C++ 结合使用。我正在使用在运行时加载和卸载的应用程序插件。在应用程序的生命周期中,同一个插件可能会被加载多次。其中一个插件对需要存储在 QVariant
中的某些类型使用 Q_DECLARE_METATYPE
。稍后重新加载插件时,旧声明仍指向现在卸载的库的原始内存空间。当 Qt 尝试从重新声明的元类型创建 QVariant
时,这会导致访问冲突。我们已经处理了 qRegisterMetaType()
的类似问题:我们在加载库时注册元类型,并在卸载库之前注销这些类型。不幸的是,在声明而不是注册元类型时,这似乎不是一个选项。
我们如何有效处理声明元类型的库被多次加载和卸载的情况?
最佳答案
要扩展 Kuba Ober 的答案,您需要通过调用 QMetaType::unregisterType()
注销元类型。 ( http://doc.qt.io/qt-4.8/qmetatype.html#unregisterType ) 在卸载 DLL 之前使用您的类型名称。您应该能够在与使用 qRegisterMetaType<T>
注册的类型相同的位置取消注册已声明的元类型。 .这应该使 Qt 元对象系统处于干净状态(至少就您卸载的插件而言),以便下次加载插件时,将生成新的元类型 ID。具体来说,当再次加载 DLL 时,Q_DECLARE_METATYPE
宏将再次注册您的类型,这次使用新的 metatype_id
, 和 QVariant
不应再给您带来访问冲突。
关于c++ - 将 Q_DECLARE_METATYPE 与可能被多次加载的 DLL 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19234703/