Russian Qt Forum
Ноябрь 25, 2024, 07:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сегментация при повторной загрузке плагинов  (Прочитано 2328 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Август 16, 2012, 14:22 »

Добрый день. Столкнулся с такой вот бедой.
В приложении нужно загружать/выгружать плагины. Сейчас плагины используются только в режиме редактора.
По умолчанию програ при запуске переходит в режим редактора. Плагины загружаются нормально, все работает.
Потом перехожу в режим исполнения, плагины выгружаются. Все нормально. Теперь нужно перейти опять в режим редактора, и при загрузке плагина прога валится в сегментацию.
Привожу код.

Код:
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();
}


Логика режима работы программы при смене с редактора на исполнение и назад удаляется/создается заново.
Есть пока три объека-логики:
Редактор и два исполнительных.
При переключении с редактора на исполнение, редактор удаляется (выгружаются плагины) и создается новый объект логики исполенения программы.
И наоборот, при переключении с исполенни в редактирование, удаляется исполнитель, создается редактор (грузятся плагины).
По умолчанию при старте программы создается редактор.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Август 16, 2012, 14:39 »

Так, нашёл причину вылета, но не могу понять как так получается.
У меня в папке с плагинами лежит две библиотчески, одна загружается нормально, другая не загружается (в первый раз!) изза undefined reference (тут еще нужно разбираться, что то не учел при сборке, ну да ладно, это сейчас не так важно).
Так вот, при первой загрузке некорретный плагин не грузится, о чем выдается соотвествующее предупреждение в консоль.
А вот при втором разе загрузке плагинов, некорректный плагин почему то грузится! (метод QPluginLoader::load()), и ошибок не выдает при загруке. Но при попытке поулчения корневого объекта их плагина вылетает сегментация... очень странно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 23.