170 похожих чатов

Всем привет! Есть плагин (.dll), при работающем приложении пытаюсь выгрузить и

подменить его на другой (обновить).
В логах пишет QLibraryPrivate::unload succeeded, но при попытке подменить операционная система сообщает что файл занят процессом.
Вот пример того что я пытаюсь сделать

QPluginLoader *pluginLoader = new QPluginLoader;
pluginLoader->setFileName("plugins/plugin");
IFactory *factory = qobject_cast<IFactory *>(pluginLoader->instance());

plugin->unload();
qDebug() << plugin->isLoaded(); //false
delete plugin;

QThread::sleep(1000);

Я так думаю здесь замешан factory, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.

34 ответов

12 просмотров
Булат-Гиниятов Автор вопроса

ребят, есть что подсказать по этой проблеме?

А в какой строчке падает? Что именно пишет? Как пытаетесь подменить? Какая ос?

Если кто-то держит .dll , значит она просто загружена кем-то ещё. Надо найти кем и выгрузить, и все дела

Булат-Гиниятов Автор вопроса
🐙 Antony Polukhin
А в какой строчке падает? Что именно пишет? Как пы...

Данный код рабочий, приложение не падает. ОС Win10. Подменить пытаюсь заменой файла .dll

Поставь sysinternals , посмотри, кто держит .dll

Булат Гиниятов
Падает она если добавить delete factory

Приведите нормальный, полноценный пример кода. А то у вас то plugin, то factory ; код не состыкуется с описанием - добавьте коментарии где, что и как подменяете

Твой вопрос про factory вообще бессмысленный : это не стандартный класс с++, кто и что с ним надо делать - знаешь только ты либо документация на твой фреймворк

Булат-Гиниятов Автор вопроса
🐙 Antony Polukhin
Приведите нормальный, полноценный пример кода. А т...

Вот полный, заменил свой класс на qobject, чтоб не смущал (после проверил, поведение такое же). int main(int argc, char *argv[]) { qputenv("QT_DEBUG_PLUGINS", QByteArray("1")); QCoreApplication a(argc, argv); QPluginLoader *plugin = new QPluginLoader; plugin->setFileName("plugins/plugin"); QObject *pluginLoaderObject = plugin->instance(); QObject *myObject = qobject_cast<QObject *>(pluginLoaderObject); plugin->unload(); qDebug() << plugin->isLoaded(); //false QThread::sleep(20000); }

Булат-Гиниятов Автор вопроса
🐙 Antony Polukhin
Приведите нормальный, полноценный пример кода. А т...

Заменить пытаюсь файл dll обычным копипастом

Булат Гиниятов
Заменить пытаюсь файл dll обычным копипастом

Повторю за админом: установи SysInternals ProcessExplorer и посмотри кто держит длл.

Булат-Гиниятов Автор вопроса
Гласси
Повторю за админом: установи SysInternals ProcessE...

Посмотрел, держит его само приложение, но не понятно, почему он тогда пишет что выгрузил успешно?

Булат Гиниятов
Посмотрел, держит его само приложение, но не понят...

Видимо, плагин выгружен, а .dll - нет Ты про счётчик загрузок dll знаешь?

Булат Гиниятов
Посмотрел, держит его само приложение, но не понят...

Напиши отдельно FreeLibrary несколько раз в цикле на эту библиотеку, наверняка оно выгрузит

Булат Гиниятов
Нет

Ты можешь загружать библиотеку несколько раз из приложения. При этом счётчик загрузок каждый раз увеличивается, но реально библиотека загружается только один раз. Но выгрузить библиотеку нужно также несколько раз, сколько загружал.

Булат Гиниятов
Ок, спасибо, попробую

Я в общем к тому что ты где-то напорол, и загрузил лишний раз. Это надо искать

Булат-Гиниятов Автор вопроса
Булат Гиниятов
Разумеется читал

Once loaded, plugins remain in memory until all instances of QPluginLoader has been unloaded, or until the application terminates. You can attempt to unload a plugin using unload(), but if other instances of QPluginLoader are using the same library, the call will fail, and unloading will only happen when every instance has called unload(). Right before the unloading happens, the root component will also be deleted.

Булат-Гиниятов Автор вопроса
Ilya Zviagin
Я в общем к тому что ты где-то напорол, и загрузил...

Нашел вот это https://stackoverflow.com/questions/36132995/unload-all-qt-dlls Там сказано что qt сознательно сделали так, чтобы все dll которые подгружаются остаются до завершения твоей проги. Получается надо юзать freelibrary как обходной путь?

Anatoly Shirokov
Once loaded, plugins remain in memory until all in...

Где вы удалили объект полученный через instance до unload?

Булат-Гиниятов Автор вопроса
Anatoly Shirokov
Где вы удалили объект полученный через instance до...

Да, я пробовал удалять, не помогает, библиотека все еще остается подгруженной

Булат Гиниятов
Нашел вот это https://stackoverflow.com/questions/...

Нет, пока нет для этого резонов. Я имел в виду тебе использовать эту функцию только для диагностики, сколько у библиотеки счётчик ссылок

Булат-Гиниятов Автор вопроса
Ilya Zviagin
Нет, пока нет для этого резонов. Я имел в виду теб...

Немного запутался, мне надо вот так попробовать выгрузить? FreeLibrary(HMODULE(plugin));

Булат Гиниятов
Да, я пробовал удалять, не помогает, библиотека вс...

pluginLoader.setLoadHints(pluginLoader.loadHints() & ~QLibrary::PreventUnloadHint); а этот флаг сбрасывали перед загрузкой плагина?

Булат-Гиниятов Автор вопроса
Булат-Гиниятов Автор вопроса
Anatoly Shirokov
pluginLoader.setLoadHints(pluginLoader.loa...

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

Булат Гиниятов
Да, работает, спасибо. Получается флаг PreventUnlo...

заглянул бы в исходники, получил бы ответ моментом :)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта