2017-08-07 87 views
-1

C++ Qt5支持多种插件版本

我的应用程序有一个插件架构,有6种不同类型的插件。 API由7个头文件组成,每个头文件包含一个抽象类:1个基类,其中包含一些常见的东西,另外6个是每种类型的。每个抽象类都包含一些常量,纯虚函数和插槽以及信号定义(所有类都有Q_OBJECT宏)。类型特定的类从基类继承。

插件本身是动态库,带有“extern”工厂函数,该函数返回指向类型特定抽象类实现的类实例的指针。

目前为止还不错。但是,现在应该为插件添加新功能,因此需要创建插件API的新版本。为了防止有人创建第三方插件,我想支持基于旧版本的插件。

在当前的设置中,插件包含应用程序使用的相同头文件,这意味着每次引入更改时都必须重新编译所有插件。不支持旧插件版本。

如果我为每个插件提供了自己的API头副本,那么基于旧版本的插件将存在不兼容问题,并且该应用很可能会因某些分段错误而死亡。再一次,不支持旧的插件版本。

我想到的另一件事是每个版本都有自己的类。所以我想要base_1,base_2,typeA_1,typeA_2,typeB_1,typeB_2等,但是Q_OBJECT不支持多继承,所以如果typeA_1从base_1继承,typeA_2不能同时继承typeA_1和base_2。不这样工作。更不用说它会创建维护代码的地狱,即使它工作...

任何人有什么好主意如何管理这种情况?或者要重新设计什么才能使其易于管理?

代码能够在launchpad.net/waver

+0

这个问题可能更适合SE Software Engineering。 – user0042

+0

user0042没有SE和Software Engineering等标签... – Peter

回答

0

被看作如果有人跑进了类似的情况,这是我落得这样做。

  1. 把插件API的每个版本到它自己的目录(这意味着用于基本报文头和特定类型的抽象类)。插件类型仍然从基础继承,但版本之间没有连接。

  2. 插件可以包含他们想要使用的任何版本的头文件。

  3. 每个插件必须覆盖一个方法来返回兼容性级别指示符。

  4. 不再投射从加载的插件库获得的对象。相反,我使用Qt的MetaObject和它的Invoke方法来执行插件方法。

  5. 兼容性级别指示器可用于检查可以执行哪些方法以及可以连接哪些信号。

工程就像一个魅力。