#include "qtpluginmanager.h"
#include <QFileInfo>
#include <QApplication>
#include <QJsonObject>
#include <QJsonArray>
#include"interfaceplugin.h"
// 加载所有插件
QDir QtPluginsManager::getPluginPath()
{
// 进入插件目录
QDir path = QDir(qApp->applicationDirPath());
path.cd("../plugins");
return path;
}
void QtPluginsManager::loadAllPlugins()
{
// 进入插件目录
QDir path = getPluginPath();
// 初始化插件中的元数据
foreach (QFileInfo info, path.entryInfoList(QDir::Files | QDir::NoDotAndDotDot))
{
scan(info.absoluteFilePath());
}
// 加载插件
foreach (QFileInfo info, path.entryInfoList(QDir::Files | QDir::NoDotAndDotDot))
{
loadPlugin(info.absoluteFilePath());
}
}
// 扫描 JSON 文件中的插件元数据
void QtPluginsManager::scan(const QString& path)
{
/*****
* 判断是否是库(后缀有效性)
* Windows:.dll、.DLL
* Unix/Linux:.so
*****/
if (!QLibrary::isLibrary(path))
return;
// 获取元数据(名称、版本、依赖)
QPluginLoader *loader = new QPluginLoader(path);
QJsonObject json = loader->metaData().value("MetaData").toObject();
d->m_names.insert(path, json.value("name").toVariant());
d->m_versions.insert(path, json.value("version").toVariant());
d->m_dependencies.insert(path, json.value("dependencies").toArray().toVariantList());
delete loader;
loader = Q_NULLPTR;
}
// 加载插件
void QtPluginsManager::loadPlugin(const QString& path)
{
// 判断是否是库
if (!QLibrary::isLibrary(path))
return;
// 检测插件依赖
if (!d->check(path))
return;
// 加载插件
QPluginLoader *loader = new QPluginLoader(path);
if (loader->load()) {
// 如果继承自 Plugin,则认为是自己的插件(防止外部插件注入)。
InterfacePlugin *plugin = qobject_cast<InterfacePlugin *>(loader->instance());
if (plugin)
{
d->m_loaders.insert(path, loader);
plugin->output("plugin");
}
else
{
delete loader;
loader = Q_NULLPTR;
}
}
}
// 卸载所有插件
void QtPluginsManager::unloadAllPlugins()
{
foreach (const QString &path, d->m_loaders.keys())
unloadPlugin(path);
}
// 卸载插件
void QtPluginsManager::unloadPlugin(const QString& path)
{
QPluginLoader *loader = d->m_loaders.value(path);
// 卸载插件,并从内部数据结构中移除
if (loader->unload())
{
d->m_loaders.remove(path);
delete loader;
loader = Q_NULLPTR;
}
}
QList<QPluginLoader *> QtPluginsManager::allPlugins()
{
return d->m_loaders.values();
}
QPluginLoader* QtPluginsManager::getPlugin(const QString &name)
{
QPluginLoader *loader = d->m_loaders.value(d->m_names.key(name));
return loader;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论


















收起资源包目录

























共 20 条
- 1
资源评论


q2nAmor
- 粉丝: 1w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 锐捷网络实验指导书.doc
- 国际旅行社管理软件.doc
- 综合布线施工规范(1).ppt
- 基于dPMR标准的数字对讲机软件系统设计样本.doc
- 基于单片机智能浇花系统设计.doc
- 计算机教学实验中心项目申报书.doc
- 青简问对-AI人工智能资源
- 2023年年绍兴市专业技术人员继续教育之物联网技术应用题库.doc
- TinyPiXOS-tinyPiXApp-52732-1753628115685.zip
- 一种安全攸关嵌入式系统需求追踪方法[PDF].pdf
- 我的PMP备考心得.docx
- bp神经网络与实例修改版.pptx
- 高三一轮总复习从杂交育种到基因工程PPT课件.ppt
- 网络营销:现代营销的延伸.pptx
- OurChat-Rust资源
- 系统集成绩效评价体系样本.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
