gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:43 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com