2017-08-07 91 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. 兼容性級別指示器可用於檢查可以執行哪些方法以及可以連接哪些信號。

工程就像一個魅力。