178 lines
4.3 KiB
C++
178 lines
4.3 KiB
C++
|
|
#include "HPluginManage.h"
|
|||
|
|
|
|||
|
|
#include <QPluginLoader>
|
|||
|
|
#include <QDebug>
|
|||
|
|
#include <QCoreApplication>
|
|||
|
|
#include <QDir>
|
|||
|
|
#include <QtCore/QFileInfo>
|
|||
|
|
|
|||
|
|
//#include "CallManage.h"
|
|||
|
|
|
|||
|
|
#ifdef WIN32
|
|||
|
|
#pragma execution_character_set("utf-8")
|
|||
|
|
#endif // WIN32
|
|||
|
|
|
|||
|
|
//控件对象单例指针
|
|||
|
|
HPluginManage *_pInstance = nullptr;
|
|||
|
|
|
|||
|
|
HPluginManage::HPluginManage()
|
|||
|
|
{
|
|||
|
|
//加载所有窗口控件.
|
|||
|
|
#ifdef QT_DEBUG
|
|||
|
|
loadPlugin("/customPlugind/");
|
|||
|
|
#else
|
|||
|
|
loadPlugin("/customPlugin/");
|
|||
|
|
#endif // QT_DEBUG
|
|||
|
|
//加载组件库组件
|
|||
|
|
//loadPlugin("/customPlugin/");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HPluginManage::~HPluginManage()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HPluginManage *HPluginManage::getInstance()
|
|||
|
|
{
|
|||
|
|
if (_pInstance == nullptr)
|
|||
|
|
{
|
|||
|
|
_pInstance = new HPluginManage();
|
|||
|
|
}
|
|||
|
|
return _pInstance;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
std::list<HPLUGIN_INFO *> HPluginManage::getPluginList()
|
|||
|
|
{
|
|||
|
|
return m_PluInfoList;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QList<QString> HPluginManage::scan(QString filePath)
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
//用来临时存储文件路径
|
|||
|
|
QString strFile;
|
|||
|
|
//取文件路径并给QDir类型
|
|||
|
|
QDir dir(filePath);
|
|||
|
|
//链表,存储文件路径
|
|||
|
|
QList<QString> fileList;
|
|||
|
|
//文件信息
|
|||
|
|
QFileInfo fileInfo;
|
|||
|
|
#ifdef _WIN32
|
|||
|
|
fileList << "*.dll";
|
|||
|
|
#else
|
|||
|
|
fileList << "*.so";
|
|||
|
|
#endif
|
|||
|
|
//过滤文件
|
|||
|
|
dir.setNameFilters(fileList);
|
|||
|
|
//列出所有符合条件的文件
|
|||
|
|
QFileInfoList fileInfoList = dir.entryInfoList();
|
|||
|
|
fileList.clear();
|
|||
|
|
|
|||
|
|
//注意:fileList.at(0) = "*.so" ,从第一个开始才是所需文件完整路径
|
|||
|
|
while (i < fileInfoList.length())
|
|||
|
|
{
|
|||
|
|
fileInfo = fileInfoList.at(i);
|
|||
|
|
strFile = fileInfo.filePath();
|
|||
|
|
fileList << strFile;
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
return fileList;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool HPluginManage::loadPlugin(QString path)
|
|||
|
|
{
|
|||
|
|
if (path == "")
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
//获取plugins绝对路径.
|
|||
|
|
QString pluPath = QCoreApplication::applicationDirPath() + path;
|
|||
|
|
|
|||
|
|
//获取目录下面的所有动态库(dll/.so)
|
|||
|
|
//QStringList pluList = QvtObjectApi::getInstance()->scan(pluPath);
|
|||
|
|
QStringList pluList = this->scan(pluPath);
|
|||
|
|
|
|||
|
|
//qDebug() << "gggg" << pluPath;
|
|||
|
|
|
|||
|
|
//加载目录下的所有控件插件.
|
|||
|
|
foreach (QString item, pluList)
|
|||
|
|
{
|
|||
|
|
//加载插件
|
|||
|
|
qDebug() << "plugin path:" << item;
|
|||
|
|
QFileInfo info(item);
|
|||
|
|
QPluginLoader *loder = new QPluginLoader(item);
|
|||
|
|
loder->load();
|
|||
|
|
if (loder->isLoaded())
|
|||
|
|
{
|
|||
|
|
HPluginInterface *pInterface = dynamic_cast<HPluginInterface *>(loder->instance());
|
|||
|
|
if (pInterface != nullptr)
|
|||
|
|
{
|
|||
|
|
//将插件对象指针存储在QHash
|
|||
|
|
qDebug() << "load plugin path:" << item << " success";
|
|||
|
|
m_PluginMap.insert(pInterface->getPluName(), pInterface);
|
|||
|
|
//emit CallManage::getInstance()->SigPluLoadInfo(pInterface->getPluName(), true);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
QString error = QString("load plugin error: %1 窗口插件加载失败").arg(item);
|
|||
|
|
//QvtLogManage::getInstance()->qvtWriteLog(logData,Qvt_LEVEL_LOG_HIGH);
|
|||
|
|
error += "错误原因:" + loder->errorString();
|
|||
|
|
|
|||
|
|
QString logData = error;
|
|||
|
|
qDebug() << logData;
|
|||
|
|
QString strPluginName = "";
|
|||
|
|
if (pInterface != NULL)
|
|||
|
|
{
|
|||
|
|
strPluginName = pInterface->getPluName();
|
|||
|
|
}
|
|||
|
|
if (strPluginName == "")
|
|||
|
|
strPluginName = info.fileName();
|
|||
|
|
//emit CallManage::getInstance()->SigPluLoadInfo(strPluginName, false);
|
|||
|
|
}
|
|||
|
|
m_pluHash.push_back(loder);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
HPluginInterface *pInterface = dynamic_cast<HPluginInterface *>(loder->instance());
|
|||
|
|
//错误信息
|
|||
|
|
QString error = QString("load plugin error: %1 窗口插件加载失败!\t\t\t\t").arg(item);
|
|||
|
|
error += "错误原因:" + loder->errorString();
|
|||
|
|
QString logData = error;
|
|||
|
|
qDebug() << logData;
|
|||
|
|
//写入日志.
|
|||
|
|
//QvtLogManage::getInstance()->qvtWriteLog(logData,Qvt_LEVEL_LOG_HIGH);
|
|||
|
|
QString strPluginName = "";
|
|||
|
|
if (pInterface != NULL)
|
|||
|
|
{
|
|||
|
|
strPluginName = pInterface->getPluName();
|
|||
|
|
}
|
|||
|
|
if (strPluginName == "")
|
|||
|
|
strPluginName = info.fileName();
|
|||
|
|
//emit CallManage::getInstance()->SigPluLoadInfo(strPluginName, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_PluInfoList.clear();
|
|||
|
|
QMap<QString, HPluginInterface *>::iterator pluItem = m_PluginMap.begin();
|
|||
|
|
for (; pluItem != m_PluginMap.end(); ++pluItem)
|
|||
|
|
{
|
|||
|
|
HPLUGIN_INFO *plu_info = new HPLUGIN_INFO;
|
|||
|
|
plu_info->pluName = pluItem.value()->getPluName();
|
|||
|
|
plu_info->pluIcon = pluItem.value()->icon();
|
|||
|
|
plu_info->pluClass = pluItem.value();
|
|||
|
|
m_PluInfoList.push_back(plu_info);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool HPluginManage::unloadPlugin()
|
|||
|
|
{
|
|||
|
|
foreach(QPluginLoader *pluItem, m_pluHash)
|
|||
|
|
{
|
|||
|
|
if (pluItem->isLoaded())
|
|||
|
|
{
|
|||
|
|
pluItem->unload();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|