添加dlopen失败时错误提示

master
禅元天道 2023-07-05 17:43:54 +08:00
parent 3706bad621
commit 97798acba5
1 changed files with 56 additions and 71 deletions

View File

@ -20,13 +20,12 @@
#include <dlfcn.h> #include <dlfcn.h>
#endif #endif
namespace Plugins namespace Plugins {
{ PluginManager* PluginManager::_instance = nullptr;
PluginManager *PluginManager::_instance = nullptr;
PluginManager *PluginManager::getInstance() PluginManager* PluginManager::getInstance()
{ {
if (_instance == nullptr) if(_instance == nullptr)
_instance = new PluginManager; _instance = new PluginManager;
return _instance; return _instance;
} }
@ -39,37 +38,34 @@ namespace Plugins
void PluginManager::releasePlugs() void PluginManager::releasePlugs()
{ {
int nplug = _pluginList.size(); int nplug = _pluginList.size();
for (int i = 0; i < nplug; ++i) for(int i = 0; i < nplug; ++i) {
{ Plugins::PluginBase* p = _pluginList.at(i);
Plugins::PluginBase *p = _pluginList.at(i); bool ok = p->uninstall();
bool ok = p->uninstall(); if(!ok)
if (!ok)
continue; continue;
delete p; delete p;
} }
_pluginList.clear(); _pluginList.clear();
} }
void PluginManager::loadPlugs(GUI::MainWindow *m) void PluginManager::loadPlugs(GUI::MainWindow* m)
{ {
_mainWindow = m; _mainWindow = m;
if (m != nullptr) if(m != nullptr)
connect(this, SIGNAL(updateActionStates()), m, SIGNAL(updateActionStatesSig())); connect(this, SIGNAL(updateActionStates()), m, SIGNAL(updateActionStatesSig()));
QStringList plugins = Setting::BusAPI::instance()->getPlugins(); QStringList plugins = Setting::BusAPI::instance()->getPlugins();
const QString plugdir = QApplication::applicationDirPath() + "/plugins/"; const QString plugdir = QApplication::applicationDirPath() + "/plugins/";
QDir dir(plugdir); QDir dir(plugdir);
if (!dir.exists()) if(!dir.exists()) {
{
plugins.clear(); plugins.clear();
Setting::BusAPI::instance()->setPlugins(plugins); Setting::BusAPI::instance()->setPlugins(plugins);
return; return;
} }
for (int i = 0; i < plugins.size(); ++i) for(int i = 0; i < plugins.size(); ++i) {
{
QString pluginname = plugins.at(i); QString pluginname = plugins.at(i);
bool ok = loadPlugin(pluginname); bool ok = loadPlugin(pluginname);
if (!ok) if(!ok)
plugins.removeOne(pluginname); plugins.removeOne(pluginname);
} }
Setting::BusAPI::instance()->setPlugins(plugins); Setting::BusAPI::instance()->setPlugins(plugins);
@ -77,40 +73,36 @@ namespace Plugins
bool PluginManager::loadPlugin(QString pluginname) bool PluginManager::loadPlugin(QString pluginname)
{ {
if (isFileLoaded(pluginname)) if(isFileLoaded(pluginname))
return false; return false;
QString lang = Setting::BusAPI::instance()->getLanguage(); QString lang = Setting::BusAPI::instance()->getLanguage();
const QString plugdir = QApplication::applicationDirPath() + "/plugins/"; const QString plugdir = QApplication::applicationDirPath() + "/plugins/";
QString plugpath = plugdir + pluginname; QString plugpath = plugdir + pluginname;
qDebug() << pluginname; qDebug() << pluginname;
typedef void (*Reg)(GUI::MainWindow *, QList<Plugins::PluginBase *> *); typedef void (*Reg)(GUI::MainWindow*, QList<Plugins::PluginBase*>*);
Reg fun = nullptr; Reg fun = nullptr;
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
if (!pluginname.toLower().startsWith("plugin")) if(!pluginname.toLower().startsWith("plugin"))
return false; return false;
if (!pluginname.toLower().endsWith(".dll")) if(!pluginname.toLower().endsWith(".dll"))
return false; return false;
HMODULE hmodel = LoadLibrary(LPCWSTR(plugpath.utf16())); HMODULE hmodel = LoadLibrary(LPCWSTR(plugpath.utf16()));
if (hmodel) if(hmodel) {
{
fun = (Reg)GetProcAddress(hmodel, "Register"); fun = (Reg)GetProcAddress(hmodel, "Register");
if (fun) if(fun) {
{
fun(_mainWindow, &_pluginList); fun(_mainWindow, &_pluginList);
Plugins::PluginBase *pls = _pluginList.last(); Plugins::PluginBase* pls = _pluginList.last();
qDebug() << "Plugin: " << pls->getDescribe(); qDebug() << "Plugin: " << pls->getDescribe();
pls->install(); pls->install();
pls->setFileName(pluginname); pls->setFileName(pluginname);
pls->setWinModule(hmodel); pls->setWinModule(hmodel);
pls->reTranslate(lang); pls->reTranslate(lang);
} } else {
else
{
FreeLibrary(hmodel); FreeLibrary(hmodel);
return false; return false;
} }
@ -118,26 +110,25 @@ namespace Plugins
#endif #endif
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
if (!pluginname.toLower().startsWith("libplugin")) if(!pluginname.toLower().startsWith("libplugin"))
return false; return false;
if (!pluginname.toLower().endsWith(".so")) if(!pluginname.toLower().endsWith(".so"))
return false; return false;
void *pHandle = dlopen(plugpath.toLatin1().data(), RTLD_NOW); void* pHandle = dlopen(plugpath.toLatin1().data(), RTLD_NOW);
if (!pHandle) if(!pHandle) {
qDebug() << "dlopen error: " << dlerror();
return false; return false;
}
fun = (Reg)dlsym(pHandle, "Register"); fun = (Reg)dlsym(pHandle, "Register");
if (fun) if(fun) {
{
fun(_mainWindow, &_pluginList); fun(_mainWindow, &_pluginList);
Plugins::PluginBase *pls = _pluginList.last(); Plugins::PluginBase* pls = _pluginList.last();
qDebug() << "Plugin: " << pls->getDescribe(); qDebug() << "Plugin: " << pls->getDescribe();
pls->install(); pls->install();
pls->setFileName(pluginname); pls->setFileName(pluginname);
pls->setLinuxModule(pHandle); pls->setLinuxModule(pHandle);
pls->reTranslate(lang); pls->reTranslate(lang);
} } else {
else
{
// plugins.removeOne(pluginname); // plugins.removeOne(pluginname);
dlclose(pHandle); dlclose(pHandle);
return false; return false;
@ -150,18 +141,16 @@ namespace Plugins
void PluginManager::reTranslate(QString lang) void PluginManager::reTranslate(QString lang)
{ {
const int n = _pluginList.size(); const int n = _pluginList.size();
for (int i = 0; i < n; ++i) for(int i = 0; i < n; ++i) {
{
auto p = _pluginList.at(i); auto p = _pluginList.at(i);
p->reTranslate(lang); p->reTranslate(lang);
} }
} }
PluginBase *PluginManager::getPluginByDescribe(QString des) PluginBase* PluginManager::getPluginByDescribe(QString des)
{ {
for (auto p : _pluginList) for(auto p : _pluginList) {
{ if(des.toLower() == p->getDescribe().toLower())
if (des.toLower() == p->getDescribe().toLower())
return p; return p;
} }
return nullptr; return nullptr;
@ -175,12 +164,10 @@ namespace Plugins
bool PluginManager::releasePlugin(QString name) bool PluginManager::releasePlugin(QString name)
{ {
for (auto p : _pluginList) for(auto p : _pluginList) {
{ if(name == p->getFileName()) {
if (name == p->getFileName())
{
bool ok = p->uninstall(); bool ok = p->uninstall();
if (!ok) if(!ok)
return false; return false;
delete p; delete p;
_pluginList.removeOne(p); _pluginList.removeOne(p);
@ -191,38 +178,37 @@ namespace Plugins
return true; return true;
} }
QList<PluginBase *> PluginManager::getPluginsByType(PluginType t) QList<PluginBase*> PluginManager::getPluginsByType(PluginType t)
{ {
QList<PluginBase *> ps; QList<PluginBase*> ps;
for (PluginBase *p : _pluginList) for(PluginBase* p : _pluginList) {
{ if(p->getType() == t)
if (p->getType() == t)
ps.append(p); ps.append(p);
} }
return ps; return ps;
} }
QDomElement &PluginManager::writeToProjectFile(QDomDocument *doc, QDomElement *parent) QDomElement& PluginManager::writeToProjectFile(QDomDocument* doc, QDomElement* parent)
{ {
QDomElement pgsele = doc->createElement("Plugins"); QDomElement pgsele = doc->createElement("Plugins");
for (auto p : _pluginList) for(auto p : _pluginList)
p->writeToProjectFile(doc, &pgsele); p->writeToProjectFile(doc, &pgsele);
parent->appendChild(pgsele); parent->appendChild(pgsele);
return pgsele; return pgsele;
} }
void PluginManager::readDataFromProjectFile(QDomElement *e) void PluginManager::readDataFromProjectFile(QDomElement* e)
{ {
for (auto p : _pluginList) for(auto p : _pluginList)
p->readFromProjectFile(e); p->readFromProjectFile(e);
} }
bool PluginManager::hasInfoToSave() bool PluginManager::hasInfoToSave()
{ {
for (auto p : _pluginList) for(auto p : _pluginList)
if (p->hasInfoToSave()) if(p->hasInfoToSave())
return true; return true;
return false; return false;
@ -230,13 +216,12 @@ namespace Plugins
bool PluginManager::isFileLoaded(const QString fileName) bool PluginManager::isFileLoaded(const QString fileName)
{ {
for (auto p : _pluginList) for(auto p : _pluginList) {
{
QString name = p->getFileName(); QString name = p->getFileName();
if (name.toLower() == fileName.toLower()) if(name.toLower() == fileName.toLower())
return true; return true;
} }
return false; return false;
} }
} } // namespace Plugins