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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 记录|单例模式小记
  • Spring表达式语言(SPEL)(05)
  • 51单片机-串口通信(单片机和PC互发数据)
  • 软件部署-Docker容器化技术
  • 探索Python的数学魔法:Numpy库的神秘力量
  • 二维空间向量的p范数等密度轨迹
  • 负载均衡--资源申请说明(三)
  • 基于苹果Vision Pro的AI NeRF方案:MetalSplatter
  • SpringBoot3+Vue3开发商店上货管理系统
  • WordPress上可以内容替换的插件
  • 漫谈设计模式 [16]:中介者模式
  • windows C++ 虚拟内存的按需调拨
  • Typora教程
  • 基于图谱的记忆存储 - mem0 graph memory + neo4j
  • FreeRTOS学习笔记(五)任务进阶篇
  • JavaScript-如何实现克隆(clone)函数
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • CODING 缺陷管理功能正式开始公测
  • java8 Stream Pipelines 浅析
  • Java深入 - 深入理解Java集合
  • oldjun 检测网站的经验
  • OSS Web直传 (文件图片)
  • 翻译:Hystrix - How To Use
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 通过git安装npm私有模块
  • 新手搭建网站的主要流程
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 正则表达式小结
  • ​Java并发新构件之Exchanger
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (pycharm)安装python库函数Matplotlib步骤
  • (二)PySpark3:SparkSQL编程
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (四)c52学习之旅-流水LED灯
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)虚函数剖析
  • .Net 6.0--通用帮助类--FileHelper
  • .net dataexcel winform控件 更新 日志
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET MVC第三章、三种传值方式
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 获取url的方法
  • .NET的数据绑定
  • .net开发日常笔记(持续更新)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET业务框架的构建
  • .NET运行机制
  • ??eclipse的安装配置问题!??
  • @DataRedisTest测试redis从未如此丝滑
  • @PreAuthorize注解
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [AAuto]给百宝箱增加娱乐功能