Size: a a a

2021 March 21

БГ

Булат Гиниятов... in pro.cxx
Булат Гиниятов
Всем привет!

Есть плагин (.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, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.
ребят, есть что подсказать по этой проблеме?
источник

AP

Antony Polukhin in pro.cxx
Liber Azerate
Ну в целом ничего, но в том же ФП мы это получаем сразу. А даже в С++, например, это часто делается через &&, что тоже монада
Если всё подряд называть монадой, то правильное производительно решение тоже окажется монадой ;)
источник

AP

Antony Polukhin in pro.cxx
Булат Гиниятов
Всем привет!

Есть плагин (.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, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.
А в какой строчке падает? Что именно пишет? Как пытаетесь подменить? Какая ос?
источник

IZ

Ilia Zviagin in pro.cxx
Булат Гиниятов
Всем привет!

Есть плагин (.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, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.
Если кто-то держит .dll , значит она просто загружена кем-то ещё.

Надо найти кем и выгрузить, и все дела
источник

БГ

Булат Гиниятов... in pro.cxx
Antony Polukhin
А в какой строчке падает? Что именно пишет? Как пытаетесь подменить? Какая ос?
Данный код рабочий, приложение не падает. ОС Win10. Подменить пытаюсь заменой файла .dll
источник

IZ

Ilia Zviagin in pro.cxx
Булат Гиниятов
Всем привет!

Есть плагин (.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, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.
Поставь sysinternals , посмотри, кто держит .dll
источник

БГ

Булат Гиниятов... in pro.cxx
Antony Polukhin
А в какой строчке падает? Что именно пишет? Как пытаетесь подменить? Какая ос?
Падает она если добавить delete factory
источник

AP

Antony Polukhin in pro.cxx
Булат Гиниятов
Падает она если добавить delete factory
Приведите нормальный, полноценный пример кода. А то у вас то plugin, то factory ; код не состыкуется с описанием - добавьте коментарии где, что и как подменяете
источник

IZ

Ilia Zviagin in pro.cxx
Булат Гиниятов
Всем привет!

Есть плагин (.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, но что я с ним должен сделать? Удалять пробовал - не помогло, приложение падает.
Твой вопрос про factory вообще бессмысленный : это не стандартный класс с++, кто и что с ним надо делать - знаешь только ты либо документация на твой фреймворк
источник

БГ

Булат Гиниятов... in pro.cxx
Antony Polukhin
Приведите нормальный, полноценный пример кода. А то у вас то plugin, то 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);
}
источник

БГ

Булат Гиниятов... in pro.cxx
Antony Polukhin
Приведите нормальный, полноценный пример кода. А то у вас то plugin, то factory ; код не состыкуется с описанием - добавьте коментарии где, что и как подменяете
Заменить пытаюсь файл dll обычным копипастом
источник

ГH

Гласси Hudobin in pro.cxx
Булат Гиниятов
Заменить пытаюсь файл dll обычным копипастом
Повторю за админом: установи SysInternals ProcessExplorer и посмотри кто держит длл.
источник

БГ

Булат Гиниятов... in pro.cxx
Гласси Hudobin
Повторю за админом: установи SysInternals ProcessExplorer и посмотри кто держит длл.
Посмотрел, держит его само приложение, но не понятно, почему он тогда пишет что выгрузил успешно?
источник

IZ

Ilia Zviagin in pro.cxx
Булат Гиниятов
Посмотрел, держит его само приложение, но не понятно, почему он тогда пишет что выгрузил успешно?
Видимо, плагин выгружен, а .dll - нет

Ты про счётчик загрузок dll знаешь?
источник

БГ

Булат Гиниятов... in pro.cxx
Ilia Zviagin
Видимо, плагин выгружен, а .dll - нет

Ты про счётчик загрузок dll знаешь?
Нет
источник

IZ

Ilia Zviagin in pro.cxx
Булат Гиниятов
Посмотрел, держит его само приложение, но не понятно, почему он тогда пишет что выгрузил успешно?
Напиши отдельно FreeLibrary  несколько раз в цикле на эту библиотеку, наверняка оно выгрузит
источник

БГ

Булат Гиниятов... in pro.cxx
Ilia Zviagin
Напиши отдельно FreeLibrary  несколько раз в цикле на эту библиотеку, наверняка оно выгрузит
Ок, спасибо, попробую
источник

ГH

Гласси Hudobin in pro.cxx
Булат Гиниятов
Посмотрел, держит его само приложение, но не понятно, почему он тогда пишет что выгрузил успешно?
На SO пишут надо delete plugin;
источник

IZ

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

DF

Dollar Føølish in pro.cxx
Во , Илья шарит
источник