CTK框架(十一):使用的常见问题

目录

1.MF文件路径

2.服务必须要接口类

3.插件名命名要求

4.生命周期问题

5.一个接口对多个实现注意

6.中文输出注意

7.同一插件安装注意

8.添加元数据

9.关于升级插件时遇到的问题

10.不同插件定义资源文件注意路径问题

11.安装插件

12.插件依赖


1.MF文件路径

在编写插件添加资源文件的过程中,MF文件的路径前缀必须和MF文件中的Plugin-SymbolicName必须相同,而且也需要和生成的dll名字一致,在qtcreator中也就是TARGET,如下图:

在vs2019中设置目标文件名为MF的路径前缀,如下图:

我遇到的大部分插件加载不起来(安装失败)的原因就是插件找不到.MF文件,所以出现问题的时候就要去仔细检查下几个地方的名称是否一致。

2.服务必须要接口类

刚开始我有个想法,为什么必须要有接口,感觉多此一举,需要的功能在实现类就能完全体现了。可不可以只有实现类+激活类,如下工程:

结果是不行的,原理还不知道,反正使用这个dll就会报错:

总结上面:

①、如果一个类不继承一个接口类,那么这个类是不能使用registerService注册到ctk框架的,如果强行注册,在安装和启动此插件的时候就会报错;

②、但是完全可以使用一个没有继承接口类的类,如何使用呢?首先定义类的功能函数,如定时向ctk发送事务,然后通过在Activator的start开启这个类的定时器,这样虽然能够正常使用,但是却无法通过ctk获取到这个插件,毕竟它不是服务【无法注册成服务】,它的作用在Activator的start里就已经用掉了。

③、如果实在不想写接口类,可以继承ctk提供的ctkEventHandler类,这个类主要用于提供插件间通信【event方式】,然后把其他函数定义成当前类自己的函数就行了。

3.插件名命名要求

生成的插件名不要有下划线,因为CTK会默认将插件名中的下划线替换成点号,最后后就导致找不到插件。

4.生命周期问题

如果想把ctk初始化、插件安装启动、获取等操作封装成一个类,那么要注意:需要把ctk相关的变量定义成类属性,不能是局部变量,否则会出现各种问题如获取不了服务、服务引用为空等。

ctkPluginFrameworkFactory frameworkFactory;
ctkPluginContext* context = nullptr;

5.一个接口对多个实现注意

在使用1个接口多个插件的时候,虽然是多个插件,也会有多个激活类【从原理上来讲1个激活类就行了,但是在start里注册两次】,其中的IID只能有一个,

如果有两个会出现报错:

应该是从Qt插件基础上来说,一个dll只能有一个IID

6.中文输出注意

使用CTK的时候,尽量不要使用中文【qDebug】,不然可能会打印乱码;有时候加中文可能都直接编译不过。

7.同一插件安装注意

经过实测:同一路径的插件是可以多次安装、启动,并且不会报错,并且它们的id是一致的【相当于如果安装已经安装了某路径的插件,会直接返回】;但是将这个插件放在不同路径是会安装失败的。

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

8.添加元数据

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

9.关于升级插件时遇到的问题

即使是被停止、卸载的插件,还是被框架占用,无法对其删除,可以复制;

某个插件刚开始安装的时候是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,此时是无法安装成功的;

10.不同插件定义资源文件注意路径问题

不同插件定义资源文件时,如果不同资源文件路径相同,那么插件在使用资源文件时,只会访问到一个。

如A、B插件都定义了qrc:\xxx\yyy.img,两个插件内部使用这个图片时,显示的是同一个图片;包括qml也是一样的。

可能这也是ctk插件发布时需要前缀不一样的原因

11.安装插件

使用pluginContext->installPlugin(QUrl::fromLocalFile(pluginPath))方法安装插件,其中pluginPath是插件文件的本地路径。安装成功后,将返回一个表示已安装插件的对象。如果安装过程中发生错误(如插件文件不存在、格式错误等),将抛出异常,需要进行异常处理。

12.插件依赖

确保插件所需的所有依赖项都已正确配置。如果插件依赖于其他库或插件,这些依赖项必须在插件加载之前被正确加载和初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/438707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S:开源容器编排平台,助力高效稳定的容器化应用管理

云计算de小白 Kubernetes(简称K8s)是一个开源容器编排平台,用于自动化部署、扩展和管理容器化应用程序。 K8S诞生于Google,基于其多年在生产环境运行容器的经验,目前已成为现代微服务架构和云原生应用的核心技术。 图…

【C++算法】10.滑动窗口_长度最小的子数组

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 209. 长度最小的子数组 题目描述: 解法 解法一:暴力求解(会超时) 暴力枚举出所有子数组的和。 查找子数组n2&#xff0…

云计算 Cloud Computing

文章目录 1、云计算2、背景3、云计算的特点4、云计算的类型:按提供的服务划分5、云计算的类型:按部署的形式划分 1、云计算 定义: 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可…

idea插件开发的第六天-开发一个笔记插件

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在JTools插件之上进行开发本插件目标是做一款笔记插件,用于开发者在开发过程中随时记录信息仓库地址: jtools-notes JTools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了id…

微型导轨在IC制造设备的应用与优势

微型导轨的精度和稳定性对于机器的准确执行任务至关重要,其精确度通常用微米或毫米来衡量。其尺寸可以做到非常小,常运用在小型设备上,尤其是在IC制造设备中,其应用非常广泛。 在IC制造设备中主要用于半导体芯片的切割、封装和测试…

V2M2引擎源码BlueCodePXL源码完整版

V2M2引擎源码BlueCodePXL源码完整版 链接: https://pan.baidu.com/s/1ifcTHAxcbD2CyY7gDWRVzQ?pwdmt4g 提取码: mt4g 参考资料:BlueCodePXL源码完整版_1234FCOM专注游戏工具及源码例子分享

网站可疑问题

目标站点 Google hack 页面访问 抓包 POST /admin.php?actionlogin HTTP/2 Host: www.xjy.edu.cn Cookie: xkm_sidA6x4Cgw2zx User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0 Accept: text/html,application/xhtmlxml,appl…

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中,数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具,通过简单的拖拽操作,你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…

Redis:string类型

Redis:string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中,字符串string存储的是二进制,以byte为单位,输入的二进…

【HTML+CSS】留言板plus实现全过程

创建一个具有动态留言的简约风格留言板 在本教程中,我们将学习如何创建一个简约风格的留言板,它具备动态留言显示和一些基本动画效果。这个留言板将使用HTML和CSS构建,最终实现一个既美观又实用的界面。 准备工作 首先,确保你的…

面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面: 资源重用:连接池允许多个客户端共享有限的数据库连接,减少频繁创建和销毁连接的开销,从而提高资源的利用率。 统一的连接管理:连接池集中管理数据库连…

Stream流的终结方法(一)

1.Stream流的终结方法 2.forEach 对于forEach方法,用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包: swagger包:Swashbuckle.AspNetCore swagger包过滤器:Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

戴尔PowerEdge R840服务器亮黄灯 不开机

最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…

K8S真正删除pod

假设k8s的某个命名空间如(default)有一个运行nginx 的pod,而这个pod是以kubectl run pod命令运行的 1.错误示范: kubectl delete pod nginx-2756690723-hllbp 结果显示这个pod 是删除了,但k8s很快自动创建新的pod,但是…

C(九)while循环 --- 军训匕首操情景

匕首操,oi~oi~oi~~~~~ 接下来的几篇推文,杰哥记录的是三大循环结构的运行流程及其变式。 本篇的主角是while循环。👉 目录: while循环 的组成、运行流程及其变式关键字break 和 continue 在while 循环中的作用while 循环的嵌套题目…

基于SSM的坚果金融投资管理系统、坚果金融投资管理平台的设计与开发、智慧金融投资管理系统的设计与实现、坚果金融投资管理系统的设计与应用研究(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

我为什么决定关闭ChatGPT的记忆功能?

你好,我是三桥君 几个月前,ChatGPT宣布即将推出一项名为“记忆功能”的新特性,英文名叫memory。 这个功能听起来相当吸引人,宣传口号是让GPT更加了解用户,仿佛是要为我们每个人量身打造一个专属的AI助手。 在记忆功…

vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果 当鼠标放在左侧图标上时,可以拖动整个列表元素,调整顺序 思路介绍 使用draggable可以设置元素可拖动,然后分别设置三个事件处理函数,监听onDragstart、onDragover、onDragend三个事件 注意&#xff1a…

青少年科普教学系统小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,作品信息管理,通知公告管理,视频信息管理,系统管理 微信端账号功能包括:系统首页,视频信息&…