Russian Qt Forum

Qt => Общие вопросы => Тема начата: joker от Ноябрь 25, 2010, 10:16



Название: Подскажите по загрузке плагина
Отправлено: joker от Ноябрь 25, 2010, 10:16
В общем ситуация такова - я хочу загрузить плагин, зная заранее его имя. Ну например tableviewer. Соотвественно в Win это будет tableviewer.dll, в никсах libtableviewer.so и так далее...
В примерах же только подгрузка всех плагинов скопом в цикле...
Соответственно вопрос -  можно ли в qt автоматом ресолвить имя плагина в имя файла. В хелпах нашел только про QLibrary::isLibrary() - но тут только проверить можно.

Ну и в догонку - можно ли при загрузке пользоваться не абсолютными путями, а задать папку со своими плагинами чем то вроде QApplication::setLibraryPaths(paths) (у меня не получилось)
(qt-плагины при этом по заданному имени загружаются нормально)

Спасибо :)


Название: Re: Подскажите по загрузке плагина
Отправлено: UVV от Ноябрь 25, 2010, 10:20
Цитировать
We recommend omitting the file's suffix in fileName, since QLibrary will automatically look for the file with the appropriate suffix in accordance with the platform, e.g. ".so" on Unix, ".dylib" on Mac OS X, and ".dll" on Windows.


Название: Re: Подскажите по загрузке плагина
Отправлено: SASA от Ноябрь 25, 2010, 13:36
Что значит "можно ли в qt автоматом ресолвить имя плагина в имя файла."?
Плагин - это самая обычная библиотека, с определённым интерфейсом.
В любом месте программы Вы можете загрузить плагин из любого места.
Грузите, вызываете истанс, пользуетесь.

Например (взято из реального проекта)
Код:
QPluginLoader * loader = new QPluginLoader("абсалютное имя файла плагина");
QObject* obj = loader->instance(); // получили какой-то объект
CMyInterface * creater = qobject_cast<CMyInterface *>(obj); // Тот ли плагин
if (creater) // вроде да....
{
...
}

Есть только одна проблема, когда CMyInterface поменялся, а плагин реализует старый! Если кто знает как справится с этой ситуацией - скажите.


Название: Re: Подскажите по загрузке плагина
Отправлено: andrew.k от Ноябрь 25, 2010, 13:54
Что значит "можно ли в qt автоматом ресолвить имя плагина в имя файла."?
Плагин - это самая обычная библиотека, с определённым интерфейсом.
В любом месте программы Вы можете загрузить плагин из любого места.
Грузите, вызываете истанс, пользуетесь.

Например (взято из реального проекта)
Код:
QPluginLoader * loader = new QPluginLoader("абсалютное имя файла плагина");
QObject* obj = loader->instance(); // получили какой-то объект
CMyInterface * creater = qobject_cast<CMyInterface *>(obj); // Тот ли плагин
if (creater) // вроде да....
{
...
}

Есть только одна проблема, когда CMyInterface поменялся, а плагин реализует старый! Если кто знает как справится с этой ситуацией - скажите.

Так добавь в свой плагин возможность определения версии. А нововведения делай через наследование.
Т.е. в любом случае плагин должен поддерживать служебный интерфейс для определения совместимости.
Дальше понятно, смотришь версию сверяешь с текущей - говоришь, что плагин уже старый и не поддерживается и не загружаешь.


Название: Re: Подскажите по загрузке плагина
Отправлено: Авварон от Ноябрь 25, 2010, 14:18
Такое либо через пропертю, либо через классинфо можно сделать


Название: Re: Подскажите по загрузке плагина
Отправлено: joker от Ноябрь 25, 2010, 14:39
We recommend omitting the file's suffix in fileName, since QLibrary will automatically look for the file with the appropriate suffix in accordance with the platform, e.g. ".so" on Unix, ".dylib" on Mac OS X, and ".dll" on Windows.

угу, а в QPluginLoader
Цитировать
To be loadable, the file's suffix must be a valid suffix for a loadable library in accordance with the platform, e.g. .so on Unix, - .dylib on Mac OS X, and .dll on Windows. The suffix can be verified with QLibrary::isLibrary().

Т.е. делать QLibrary, вкидывать имя файла плагина, снимать имя файла... както слишком неудобно получается.

Что значит "можно ли в qt автоматом ресолвить имя плагина в имя файла."?
....

Например (взято из реального проекта)
Код:
QPluginLoader * loader = new QPluginLoader("абсалютное имя файла плагина");

Вот меня и интересует, как универсально получить "абсалютное имя файла плагина"


Название: Re: Подскажите по загрузке плагина
Отправлено: andrew.k от Ноябрь 25, 2010, 17:28
В тех двух цитатах нет противоречия. Во второй сказано, что файл должен иметь расширение в соответствии с платформой и все.
При использовании тебе необходимо указать только имя файла без расширения, расширение qt сам подставит в соответствии с платформой, поэтому и написано, что должен иметь соответствующее расширение.
Это собственно и сделано для того, чтобы не было проблемы определять расширения. Хотя я и проблемы тут не вижу.

ЗЫ. И что за идиотский спелинг? Это уже не модно!


Название: Re: Подскажите по загрузке плагина
Отправлено: SASA от Ноябрь 25, 2010, 18:51
Вот меня и интересует, как универсально получить "абсалютное имя файла плагина"
У меня рядом с исполнимым файлом лежит каталог plugins. Я тупо перебираю все файлы из этого каталога.  :-\

Цитировать
Такое либо через пропертю, либо через классинфо можно сделать
А можно про классинфо подробнее.
При объявлении интерфейса указываешь
Q_DECLARE_INTERFACE(CMyInterface, "CMyInterface/1.0")

Кто знает что это за цифра и как её использовать.


Название: Re: Подскажите по загрузке плагина
Отправлено: TnT от Ноябрь 28, 2010, 03:02
Кто знает что это за цифра и как её использовать.


Это номер версии, его необходимо увеличивать при изменениях в интерфейсе плагина, чтобы избежать аварийного завершения программы при попытке доступа к старой версии плагина.


Название: Re: Подскажите по загрузке плагина
Отправлено: SASA от Ноябрь 29, 2010, 11:31
Это номер версии, его необходимо увеличивать при изменениях в интерфейсе плагина, чтобы избежать аварийного завершения программы при попытке доступа к старой версии плагина.

Вы этим когда-нибудь пользовались? Как прочитать эту цифру?


Название: Re: Подскажите по загрузке плагина
Отправлено: Авварон от Ноябрь 29, 2010, 11:53
Эм, никак насколько я знаю:) Интерфейсы в Qt вообще убогие. Эта циферка спасет при касте - старого класса к новому интерфейсу (каст вернет 0) и только.
По крайней мере она добавляется лишь в метод qt_metacast кажется


Название: Re: Подскажите по загрузке плагина
Отправлено: SASA от Ноябрь 29, 2010, 12:13
Я как-то сменил эту циферку - вообще все работать перестало  :)
Поразбирался минут 10 и плюнул. А тут подняли тему. У кого есть опыт изменения этой цифры. Опишите, как Вы отличаете плагины разной (просто неподходящей) версии. Если кастом, то как?
По-моему, в основе qobject_cast тупое сравнение имен классов?