方式1:使用ctk框架工廠,適用於調用普通的插件
ctkPluginFrameworkFactory frameworkFactory; QSharedPointer<ctkPluginFramework> framework = frameworkFactory.getFramework(); // 初始化並啟動插件框架 try { framework->init(); framework->start(); qDebug() << "CTK plugin framework start..."; } catch (const ctkPluginException &e) { qDebug() << "CTK plugin framework init err: " << e.what(); return -1; } // 獲取插件服務的contex ctkPluginContext* pluginContext = framework->getPluginContext(); try { // 安裝插件 QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(pluginPath)); qDebug() << QString("Plugin[%1_%2] installed...").arg(plugin->getSymbolicName()).arg(plugin->getVersion().toString()); // 啟動插件 plugin->start(ctkPlugin::START_TRANSIENT); qDebug() << "Plugin start..."; } catch (const ctkPluginException &e) { qDebug() << QString("Failed install or run plugin: ") << e.what() << e.getType(); return -2; } // 獲取服務引用 ctkServiceReference reference = pluginContext->getServiceReference<AbsLogService>(); if (reference) { // 獲取指定 ctkServiceReference 引用的服務對象 AbsLogService* service = qobject_cast<AbsLogService*>(pluginContext->getService(reference)); if (service != Q_NULLPTR) { // 調用服務 service->log("123"); } } else { qDebug()<<"reference is null"; }
方式2:使用ctk框架啟動器,適用於需要eventadmin時
QString path = QDir::currentPath() + "/third_libs/ctk/libs"; // 在插件的搜索路徑列表中添加一條路徑 ctkPluginFrameworkLauncher::addSearchPath(path); ctkPluginFrameworkLauncher::start("org.commontk.eventadmin"); // 獲取插件上下文 ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext(); // 啟動插件 BlogEventHandler try { QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(pluginPath1)); plugin->start(ctkPlugin::START_TRANSIENT); qDebug() << "BlogEventHandler start ..."; } catch (const ctkPluginException &e) { qDebug() << "Failed to start BlogEventHandler" << e.what(); } // 啟動插件 BlogManager try { QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(pluginPath2)); plugin->start(ctkPlugin::START_TRANSIENT); qDebug() << "BlogManager start ..."; } catch (const ctkPluginException &e) { qDebug() << "Failed to start BlogManager" << e.what(); } // 停止插件 ctkPluginFrameworkLauncher::stop();