#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;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
PluginApp2.rar (20个子文件)
PluginApp2
PluginB
pluginB.h 519B
PluginB.pro 391B
pluginB.cpp 226B
programmer.json 204B
TTTT
main.cpp 260B
interfaceplugin.h 378B
TTTT.pro 1KB
qtpluginmanager.h 1KB
widget.h 277B
qtpluginsmanagerprivate.h 602B
widget.cpp 233B
qtpluginsmanagerprivate.cpp 1KB
qtpluginmanager.cpp 3KB
widget.ui 441B
PluginApp.pro 81B
PluginA
pluginA.h 599B
pluginA.cpp 281B
PluginA.pro 451B
programmer.json 204B
pluginA.ui 398B
共 20 条
- 1
资源评论
q2nAmor
- 粉丝: 9093
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功