crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как вызвать из плагина функцию приложения?
mva
  опции профиля:
сообщение 17.9.2010, 22:03
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Добрый день!

Никак не могу найти в документации описание того, как правильно из плагина вызывать метод класса основного приложения. У меня выдается сообщение об ошибке "...: symbol lookup error: ... : undefined symbol: ... ". Может кто подскажет как это делается или где искать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
wiz29
  опции профиля:
сообщение 20.9.2010, 12:28
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Думаю, правльно былобы иметь некий интерфейс, реализованый на уровне приложения, и передавть в плагин указатель на интерфейс.
Все остальные подходы имеют свои недостатки и усиливают бинарную связь между плагином и приложением.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 21.9.2010, 8:42
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(wiz29 @ 20.9.2010, 13:28) *
Думаю, правльно былобы иметь некий интерфейс, реализованый на уровне приложения, и передавть в плагин указатель на интерфейс.
Все остальные подходы имеют свои недостатки и усиливают бинарную связь между плагином и приложением.


Этот вариант мне показался самым простым. Если под интерфейсом понимается простой класс-прослойка, а не какой-либо специализированный класс Qt, то я вчера попробовал сделать такой интерфейс. Результат тот же. Точно также плагин не находит методы-члены этого класса.


Цитата(SABROG @ 20.9.2010, 12:05) *
Вероятно можно передавать указатель на нужный объект через специальный метод, который объявить в плагине, типа setApplicationObject(QObject*). Приложение при подгрузке плагинов будет передавать в этот метод указатель на нужный объект. А там уже можно будет и через сигналы общаться.


Да, у меня так и сделано. Проблема только в том, что через механизм сигналов-слотов нельзя вернуть данные.

Цитата(Litkevich Yuriy @ 18.9.2010, 9:44) *
На мой взгляд это единственный способ сказать линкеру, что реализации метода нет и не нужно её пытаться искать.


Сообщение об ошибке появляется не на этапе линковки, а во время выполнения программы в момент обращения к функции основного приложения в плагине.

Цитата(igor_bogomolov @ 18.9.2010, 1:33) *
Ну, видимо, у меня используется подобная архитектура.
Т.е. есть некий функционал который используется как в основном приложении так и в плагинах. Сначала эти файлы у меня участвовали в компиляции как основного приложения так и плагинов. Т.е. происходило некое дублирование. И никаких проблем с этим нет, пока нет статических полей, ну или просто каких то общи данных, разделяемых между приложением и плагинами. Сейчас общий код у меня вынесен в отдельную разделяемую библиотеку, которая уже и используется всеми кто в ней заинтересован. Это мне кажется оптимальным вариантом.

В качестве еще одного варианта могу предложить GCC visibility (тык тык тык)


Я так понял, что GCC visibility имеет смысл, если создается библиотека. Выделение искомого кода в библиотеку затруднительно по причине большой связности с остальным кодом. Это везде перед вызовом функции нужно вставлять код для поиска данной функции в библиотеке. Хотелось бы сделать по-проще.

Пока думаю остановиться на таком варианте: после загрузки плагина "начинить" его необходимыми для его работы данными, чтобы он сам не обращался за ними в основную программу. Но вопрос вызова функций из основного приложения все же остается открытым.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- mva   Как вызвать из плагина функцию приложения?   17.9.2010, 22:03
- - igor_bogomolov   Ну, видимо, у меня используется подобная архитекту...   18.9.2010, 0:33
- - Litkevich Yuriy   если я правильно понимаю происходящее, то проблема...   18.9.2010, 8:44
- - SABROG   Цитата(mva @ 17.9.2010, 23:03) Никак не м...   20.9.2010, 11:05
- - wiz29   Думаю, правльно былобы иметь некий интерфейс, реал...   20.9.2010, 12:28
|- - mva   Цитата(wiz29 @ 20.9.2010, 13:28) Думаю, п...   21.9.2010, 8:42
- - Litkevich Yuriy   приведи код интерфейса и код использования в плаг...   21.9.2010, 9:33
- - SABROG   Цитата(mva @ 21.9.2010, 9:42) Но вопрос в...   21.9.2010, 11:15
- - igor_bogomolov   Написал тестовый пример имитирующий проблему (пере...   21.9.2010, 11:26
- - mva   Извиняюсь, не указал важную деталь и возможно ввел...   21.9.2010, 11:49
|- - wiz29   Цитата(mva @ 21.9.2010, 12:49) Извиняюсь,...   21.9.2010, 12:09
- - igor_bogomolov   Т.е. падение происходит когда приложение испускае...   21.9.2010, 12:06
- - mva   Вот код плугина searchparameters.h Раскрывающийся...   21.9.2010, 23:02
- - igor_bogomolov   Видимо в файле проекта плагина отсутствуют следущи...   22.9.2010, 2:25
- - mva   Все, проблему решил простейшим образом. CODE void...   22.9.2010, 9:50


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


15 чел. читают эту тему (гостей: 15, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.12.2024, 13:41