Добрый день. Столкнулся с такой вот бедой.
В приложении нужно загружать/выгружать плагины. Сейчас плагины используются только в режиме редактора.
По умолчанию програ при запуске переходит в режим редактора. Плагины загружаются нормально, все работает.
Потом перехожу в режим исполнения, плагины выгружаются. Все нормально. Теперь нужно перейти опять в режим редактора, и при загрузке плагина прога валится в сегментацию.
Привожу код.
void CArmEditor::loadPlugins()
{
#ifdef Q_WS_WIN32
QDir pluginsDir(QDir::currentPath()+"/plugins");
#else
QDir pluginsDir(QDir::homePath()+"/plugins");
#endif
QPluginLoader * loader;
foreach(QString filename, pluginsDir.entryList(QDir::Files))
{
loader = new QPluginLoader;
loader->setFileName(pluginsDir.absoluteFilePath(filename));
if(!loader->load())
{
qDebug("%s",qPrintable(loader->errorString()));
delete loader;
continue;
}
else
{
qDebug("%s loaded",qPrintable(filename));
}
QObject * pluginObject = loader->instance(); //вот тут вылет при повтроной загрузке плагина
if(!pluginObject)
{
loader->unload();
delete loader;
continue;
}
else
fpluginLoaders.append(loader);
CDockPluginInterface * dockPlugin = qobject_cast<CDockPluginInterface*>(pluginObject);
if(dockPlugin)
{
fdockPlugins.append(dockPlugin);
}
}
}
void CArmEditor::unloadPlugins()
{
/*
foreach(CDockPluginInterface * plugin, fdockPlugins)
{
delete plugin;
}
*/
foreach(QPluginLoader * loader, fpluginLoaders)
{
if(loader->unload())
qDebug("%s unloaded",qPrintable(loader->fileName()));
else
qDebug("%s unload failed",qPrintable(loader->fileName()));
delete loader;
}
fpluginLoaders.clear();
fdockPlugins.clear();
}
Логика режима работы программы при смене с редактора на исполнение и назад удаляется/создается заново.
Есть пока три объека-логики:
Редактор и два исполнительных.
При переключении с редактора на исполнение, редактор удаляется (выгружаются плагины) и создается новый объект логики исполенения программы.
И наоборот, при переключении с исполенни в редактирование, удаляется исполнитель, создается редактор (грузятся плагины).
По умолчанию при старте программы создается редактор.