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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите по загрузке плагина  (Прочитано 5986 раз)
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« : Ноябрь 25, 2010, 10:16 »

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

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

Спасибо Улыбающийся
Записан
UVV
Гость
« Ответ #1 : Ноябрь 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.
Записан
SASA
Гость
« Ответ #2 : Ноябрь 25, 2010, 13:36 »

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

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

Есть только одна проблема, когда CMyInterface поменялся, а плагин реализует старый! Если кто знает как справится с этой ситуацией - скажите.
Записан
andrew.k
Гость
« Ответ #3 : Ноябрь 25, 2010, 13:54 »

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

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

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Ноябрь 25, 2010, 14:18 »

Такое либо через пропертю, либо через классинфо можно сделать
Записан
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #5 : Ноябрь 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("абсалютное имя файла плагина");

Вот меня и интересует, как универсально получить "абсалютное имя файла плагина"
Записан
andrew.k
Гость
« Ответ #6 : Ноябрь 25, 2010, 17:28 »

В тех двух цитатах нет противоречия. Во второй сказано, что файл должен иметь расширение в соответствии с платформой и все.
При использовании тебе необходимо указать только имя файла без расширения, расширение qt сам подставит в соответствии с платформой, поэтому и написано, что должен иметь соответствующее расширение.
Это собственно и сделано для того, чтобы не было проблемы определять расширения. Хотя я и проблемы тут не вижу.

ЗЫ. И что за идиотский спелинг? Это уже не модно!
Записан
SASA
Гость
« Ответ #7 : Ноябрь 25, 2010, 18:51 »

Вот меня и интересует, как универсально получить "абсалютное имя файла плагина"
У меня рядом с исполнимым файлом лежит каталог plugins. Я тупо перебираю все файлы из этого каталога.  В замешательстве

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

Кто знает что это за цифра и как её использовать.
Записан
TnT
Гость
« Ответ #8 : Ноябрь 28, 2010, 03:02 »

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


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

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

Вы этим когда-нибудь пользовались? Как прочитать эту цифру?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Ноябрь 29, 2010, 11:53 »

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

Я как-то сменил эту циферку - вообще все работать перестало  Улыбающийся
Поразбирался минут 10 и плюнул. А тут подняли тему. У кого есть опыт изменения этой цифры. Опишите, как Вы отличаете плагины разной (просто неподходящей) версии. Если кастом, то как?
По-моему, в основе qobject_cast тупое сравнение имен классов?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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