подменить его на другой (обновить).
В логах пишет 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, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.
ребят, есть что подсказать по этой проблеме?
А в какой строчке падает? Что именно пишет? Как пытаетесь подменить? Какая ос?
Если кто-то держит .dll , значит она просто загружена кем-то ещё. Надо найти кем и выгрузить, и все дела
Данный код рабочий, приложение не падает. ОС Win10. Подменить пытаюсь заменой файла .dll
Поставь sysinternals , посмотри, кто держит .dll
Падает она если добавить delete factory
Приведите нормальный, полноценный пример кода. А то у вас то plugin, то factory ; код не состыкуется с описанием - добавьте коментарии где, что и как подменяете
Твой вопрос про factory вообще бессмысленный : это не стандартный класс с++, кто и что с ним надо делать - знаешь только ты либо документация на твой фреймворк
Вот полный, заменил свой класс на 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); }
Заменить пытаюсь файл dll обычным копипастом
Повторю за админом: установи SysInternals ProcessExplorer и посмотри кто держит длл.
Посмотрел, держит его само приложение, но не понятно, почему он тогда пишет что выгрузил успешно?
Видимо, плагин выгружен, а .dll - нет Ты про счётчик загрузок dll знаешь?
Напиши отдельно FreeLibrary несколько раз в цикле на эту библиотеку, наверняка оно выгрузит
Ок, спасибо, попробую
На SO пишут надо delete plugin;
Ты можешь загружать библиотеку несколько раз из приложения. При этом счётчик загрузок каждый раз увеличивается, но реально библиотека загружается только один раз. Но выгрузить библиотеку нужно также несколько раз, сколько загружал.
А вы в документации были?
Я в общем к тому что ты где-то напорол, и загрузил лишний раз. Это надо искать
В доке все написано, но ее не читают
Разумеется читал
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.
Нашел вот это https://stackoverflow.com/questions/36132995/unload-all-qt-dlls Там сказано что qt сознательно сделали так, чтобы все dll которые подгружаются остаются до завершения твоей проги. Получается надо юзать freelibrary как обходной путь?
Где вы удалили объект полученный через instance до unload?
Да, я пробовал удалять, не помогает, библиотека все еще остается подгруженной
Нет, пока нет для этого резонов. Я имел в виду тебе использовать эту функцию только для диагностики, сколько у библиотеки счётчик ссылок
Немного запутался, мне надо вот так попробовать выгрузить? FreeLibrary(HMODULE(plugin));
Да, но ещё лучше разобраться с документацией
pluginLoader.setLoadHints(pluginLoader.loadHints() & ~QLibrary::PreventUnloadHint); а этот флаг сбрасывали перед загрузкой плагина?
Нет, сейчас попробую
Да, работает, спасибо. Получается флаг PreventUnloadHint по дефолту стоял. Теперь библиотека выгружается полностью и ее получилось подменить на новую. А как называется конструкция в скобках? Возможно вопрос глупый, но все же...
заглянул бы в исходники, получил бы ответ моментом :)
буду впредь заглядывать)
Обсуждают сегодня