目录
1.方式1:使用ctk框架工厂,适用于调用普通的插件
1.1.步骤
1.2.实现
2.方法2:使用ctk框架启动器,适用于需要eventadmin时
2.1.实现
3.注意事项
1.方式1:使用ctk框架工厂,适用于调用普通的插件
1.1.步骤
1) 获取插件上下文:
通过framework->getPluginContext()方法获取插件上下文(ctkPluginContext),这是安装和启动插件所必需的。
2) 安装插件:
使用pluginContext->installPlugin(QUrl::fromLocalFile(pluginPath))方法安装插件。其中,pluginPath是插件文件的本地路径。安装成功后,将返回一个QSharedPointer<ctkPlugin>对象,表示已安装的插件。如果安装过程中发生错误(如插件文件不存在、格式错误等),将抛出ctkPluginException异常,需要进行异常处理。
3) 启动插件:
使用已安装的插件对象的start(ctkPlugin::START_TRANSIENT)方法启动插件。START_TRANSIENT参数表示立即启动插件,但不设置持久状态。
如果启动失败,将抛出ctkPluginException异常,需要进行异常处理。
1.2.实现
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;
}
// 获取插件服务的context
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.方法2:使用ctk框架启动器,适用于需要eventadmin时
2.1.实现
QString path = QDir::currentPath() + "/third_libs/ctk/linkPlugin";
// 在插件的搜索路径列表中添加一条路径
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();
3.注意事项
1)插件文件命名和格式:插件文件(通常是DLL文件)的命名和格式需要符合CTK插件框架的要求。通常,插件文件应该包含必要的元数据文件(如MANIFEST.MF),并且遵循特定的目录结构。
MANIFEST.MF文件添加的目录结构如下图所示:
2)插件依赖:确保插件所需的所有依赖项都已正确配置。如果插件依赖于其他库或插件,这些依赖项必须在插件加载之前被正确加载和初始化。
3)环境变量和配置:在某些情况下,插件的加载和运行可能受到环境变量和配置的影响。因此,在安装和启动插件之前,请确保已正确设置相关的环境变量和配置。
4)错误处理和日志记录:在安装和启动插件的过程中,应该进行充分的错误处理和日志记录。这有助于诊断问题并快速修复错误。
5)插件管理:插件框架提供了丰富的API来管理插件的生命周期和服务。开发人员可以利用这些API来实现插件的动态加载、卸载、更新等功能。
通过以上步骤,您可以在CTK插件框架中成功安装并启动插件。在实际应用中,您可能需要根据具体的项目需求和环境配置进行适当的调整和优化。