c++ - 将 Q_DECLARE_METATYPE 与可能被多次加载的 DLL 一起使用

标签 c++ qt qt4

将 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/

相关文章:

c++ - 谷歌测试 : code coverage

c++ - 静态变量和模板特化歧义

c++ - QT GridLayout 添加 Stacked QLabel

debugging - gdb 远程交叉调试失败,显示 "Remote ' g' 数据包回复太长”

Qt Qbrush 问题

c++ - 为什么我不能在类范围内声明概念?

c++ - 为什么 Foo({}) 调用 Foo(0) 而不是 Foo()?

qt - 切换图像时 CPU 使用率增加

python - Qt QGraphicsDropShadowEffect 没有显示

c++ - 调试断言失败(无符号)(c+1) <= 256(在 VideoCapture::open [Qt Creator] 中)