当前位置: 首页 > news >正文

CTK框架(三): 插件的安装

目录

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插件框架中成功安装并启动插件。在实际应用中,您可能需要根据具体的项目需求和环境配置进行适当的调整和优化。


http://www.mrgr.cn/news/22215.html

相关文章:

  • SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频
  • Web开发详解
  • 【Kubernetes】常见面试题汇总(二)
  • Spring框架IOC
  • 24-9-8-读书笔记(十七)-《契诃夫文集》(三)([俄] 契诃夫 [译] 汝龙 )
  • 2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件
  • 银行贷款产品
  • MySQL基础
  • 使用Node.js实现单文件上传功能—含代码解释
  • 一文讲懂Spring Event事件通知机制
  • Redis访问工具
  • 【Java 优选算法】双指针(上)
  • 【Dart 教程系列第 50 篇】在 Flutter 项目的国际化多语言中,如何根据翻译提供的多语言文档表格,快速生成不同语言的内容
  • 计算机毕业设计选题推荐-宠物店管理系统-Java/Python项目实战
  • JVM 调优篇4 jvm的垃圾回收中垃圾日志的阅读查看2
  • 【系统架构设计师】管道-过滤器架构
  • 单片机毕业设计-基于单片机的运动手环
  • 深入理解Oracle数据库中的数据库链接
  • 【verilog】1. 流水灯例程
  • Ascend C算子开发(中级)—— 编写Sinh算子