CTK--使用中的一些問題


1、

問題:

 可以確定環境沒有任何問題,但是一運行就這樣。

 

 

解決:

刪掉這個文件夾

 2、

在編寫插件添加資源文件的過程中,有些教程說前綴需要和工程名一致。經過測試,不是和工程名一致,而是與生成的dll名字一致,也就是TARGET

 

 其他地方,如工程名、 MANIFEST.MF里的符號,都是隨便取。

3、

剛開始我有個想法,為什么必須要有接口,感覺多此一舉,需要的功能在實現類就能完全體現了。可不可以只有實現類+激活類,如下工程:

 

 結果是不行的,原理還不知道,反正使用這個dll就會報錯:

 

總結上面:

①、如果一個類不繼承一個接口類,那么這個類是不能使用registerService注冊到ctk框架的,如果強行注冊,在安裝和啟動此插件的時候就會報錯;

②、但是完全可以使用一個沒有繼承接口類的類,如何使用呢?首先定義類的功能函數,如定時向ctk發送事務,然后通過在Activator的start開啟這個類的定時器,這樣雖然能夠正常使用,但是卻無法通過ctk獲取到這個插件,畢竟它不是服務【無法注冊成服務】,它的作用在Activator的start里就已經用掉了。

③、如果實在不想寫接口類,可以繼承ctk提供的ctkEventHandler類,這個類主要用於提供插件間通信【event方式】,然后把其他函數定義成當前類自己的函數就行了。

 4、

生成的插件名不要有下划線,因為CTK會默認將插件名中的下划線替換成點號,最后后就導致找不到插件

 

5、

在獲取服務的時候,有兩個重載方式【可直接使用的】

1、AbsLogService* ret = context->getService<AbsLogService>(reference);
2、AbsLogService* ret = qobject_cast<AbsLogService*>(context->getService(reference));

其中第一個方式的原型是

 

 

第二個方式的原型是

 第一個方式實際在內部調用的第二個方式,然后實現一個qobject_cast強制轉換再返回;而第二個方式是直接返回QObject指針。

問題來了:獲取的服務必須要完成qobject_cast轉換

我試過如下代碼

QObject* ret = context->getService(reference);

就是使用第二個方式,不進行操作,然后代碼就在這里卡住了,具體原因不是很清楚,應該涉及到跨動態庫數據轉換之類的知識。。。

 

6、

如果想把ctk初始化、插件安裝啟動、獲取等操作封裝成一個類,那么要注意:需要把ctk相關的變量定義成類屬性,不能是局部變量,否則會出現各種問題如獲取不了服務、服務引用為空等。

ctkPluginFrameworkFactory frameworkFactory;
ctkPluginContext* context = nullptr;

 

7、

在使用1接口2插件的時候,雖然是兩個插件,也會有兩個激活類【從原理上來講1個激活類就行了,但是在start里注冊兩次】,其中的IID只能有一個,

 

 

如果有兩個會出現報錯:

 

應該是從Qt插件基礎上來說,一個dll只能有一個IID

 

8、

有時候出現一個現象,兩個完全相同調用CTK框架的工程,第一個能正常訪問CTK,第二個卻不能,直接運行就退出了。

可能原因是:兩個工程訪問的是同一個CTK動態庫,第一個訪問之后,雖然程序關了,但是沒有正確關閉CTK,所以導致后台還認為當前程序占用着此CTK動態庫,其他工程就自然訪問失敗了。

解決:重啟Qt

 

9、

使用CTK的時候,盡量不要使用中文【qDebug】,不然可能會打印亂碼;有時候加中文可能都直接編譯不過。。。

 

10、

經過實測:

VS2015編譯出的CTK,使用QT+MSVC2015_64失敗;Qt+MSVC2017_64可行
VS2017編譯出的CTK,可正常使用,在Qt+MSVC2015_64、Qt+MSVC2017_64都測試過,但是無法在Qt+MingW里使用;
MingW編譯出的CTK,任何環境都無法使用

 

11、

經過實測:同一路徑的插件是可以多次安裝、啟動,並且不會報錯,並且它們的id是一致的【相當於如果安裝已經安裝了某路徑的插件,會直接返回】;但是將這個插件放在不同路徑是會安裝失敗的

注意,這里的同一插件是指插件名稱,而不是MF里的name

 

 

12、

可直接在MF文件里添加自己特有的元數據,如:

 

13、關於升級插件時遇到的問題

即使是被停止、卸載的插件,還是被框架占用,無法對其刪除,可以復制;

某個插件剛開始安裝的時候是V1.0,卸載之后第二次安裝的時候是V2.0,此時插件提供的接口都更新成功,但是通過讀取MF文件的headers還是V1.0的信息;

同一路徑的某插件,安裝多次,雖然不會報錯,但是除了第一次,后面全部都直接返回,不會對框架產生任何變化,把第一次安裝成為有效安裝。【如安裝A-安裝A-安裝A,只有第一次安裝才是有效的,后面沒有任何作用】;

同一插件【接口名稱相同,實現可以不同,版本也可以不同】放在不同路徑,如果都安裝了,那么調用的接口是最后那次”有效”’安裝的插件的。【如安裝A-安裝B,那么最后調用的B;安裝A-安裝B-安裝A,最后調用的是B,因為最后一次安裝A是無效安裝】;

如果生成了a.dll插件,我們手動把命名改成了a.1.0.0.dll,此時是無法安裝成功的;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM