|
|
|
Теория плагинов30.04.2010, 17:02. Показов 33833. Ответов 40
Метки нет (Все метки)
Всем привет.
Для одной моей проги, нужно реализовать поддержку плагинов. Плагины предполагаются простенькие, написанные на Си. То, что плагин, это просто .so файл - понятно. То, что прога может дергать из .so файла функции - тоже понятно. 1. Непонятно то, как сам плагин сможет дергать функции из программы? 2. Программа написана на С++, но плагины предполагаю писать на Си, во избежания бинарной несовместимости. В этом случае, какие сложности могут возникнуть? 3. Еще непонятно, каким образом "разделять" плагины, ведь их может быть несколько? 4. И еще непонятно, каким образом программе "сообщить" какие функции дергать из конкретного плагина? 5. И еще непонятно, каким образом плагин, сможет дергать функции из другого плагина? Нужна теоретическая подкова ![]() Благодарен всем откликнувшимся.
0
|
|
| 30.04.2010, 17:02 | |
|
Ответы с готовыми решениями:
40
Написание плагинов для notepad++ Система плагинов Взаимодействие плагинов |
|
|
||||||
| 01.05.2010, 00:56 | ||||||
|
Или я не понял вопроса
1
|
||||||
|
|
||||||
| 01.05.2010, 03:01 [ТС] | ||||||
![]()
0
|
||||||
|
|
|||
| 01.05.2010, 11:06 | |||
|
Ты лучше поясни конкретно, что хочешь
1
|
|||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 01.05.2010, 12:20 | |
|
niXman, если у тебя какая-то функция в определенных плагинах ведет себя совсем "по-особенному", то лучше будет разделить твои плагины по типу. К примеру, чтобы любой твой плагин экспортировал функцию, допустим, getType(), которая вернет тип плагина. Это может быть число или строчка, как угодно. Твоя основная программа будет всегда будет вызывать эту функцию после загрузки .so и определять с каким типом плагина она имеет дело и соответстенно знать, что в общих чертах будут делать функции этого плагина.
Или я не понял вопрос
1
|
|
|
|
||||||
| 10.03.2011, 16:41 [ТС] | ||||||
|
а как экспортировать классы из плагина?
к примеру, мне нужно, чтоб некоторый плагин определял реализацию некоторого класса. при этом, программа, знает экспортируемый тип только по интерфейсу. тогда, полагаю, в плагине должна быть функция типа create() пример:
как все же экспортировать классы из плагина? спасибо.
0
|
||||||
|
|
|
| 10.03.2011, 17:24 | |
|
Вообще говоря, классы нельзя "экспортировать". В Си++ компилятор должен явно видеть описание класса. Можно конечно мухлевать с виртуальными классами, но так или иначе у тебя будут экспортироваться действия или данные, но не типы
1
|
|
|
|
|
| 10.03.2011, 18:00 | |
|
Жизнеспособность кода зависит от того, что ты вкладываешь в это понятие. Ты же по сути не экспортируешь новые типы, а экспортируешь лишь указатель на объект, приведённый к базовому типу. Основная программа может через этот указатель вызывать методы класса i_type, но фактически это означает лишь работу с кодами и с данными. Но не с типом.
Это вовсе не есть экспортирование производного типа, а всего лишь обычное виртуальное наследование.
1
|
|
|
|
|||||
| 10.03.2011, 18:13 [ТС] | |||||
![]() а как реализовать экспортирование? или это все же никоим образом невозможно?
0
|
|||||
|
|
|||
| 10.03.2011, 18:30 | |||
|
1
|
|||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||||||
| 10.03.2011, 18:33 | ||||||
|
Не очень вникал в трид, но предложу такое:
1
|
||||||
|
|
|
| 10.03.2011, 18:46 [ТС] | |
|
Добавлено через 1 минуту
Evg, и последний вопрос: можешь пояснить более популярно чем в куче манов, что конкретно выполняет флаг -fPIC при либковке .so файла? обсуждение продолжено здесь: Вопросы по динамическим библиотекам
0
|
|
|
|
|||||||||||||||||||||||
| 12.03.2011, 13:46 [ТС] | |||||||||||||||||||||||
|
есть базовый тип для плагинов:
собираю плагин так:
1) методы реализаций должны быть виртуальными. т.е. в наши методы get() и set() нужно добавить спецификатор virtual. 2) в хидере, не пишите реализацию, т.к. в таком случае, компилятор будет использовать ее, и получится каша ![]() пример:
0
|
|||||||||||||||||||||||
|
|
|
| 12.03.2011, 14:19 | |
|
В твоём примере главная программа использует тип type1, который реализован в плагине. Т.е. программа должна "знать" о плагине, что, мягко говоря, делает твой плагин не плагином, а частью программы
0
|
|
|
|
||
| 12.03.2011, 14:49 | ||
|
Добавлено через 55 секунд Методы Set и Get вываливаются за рамки интерфейса, но ты их используешь в главной программе
0
|
||
|
|
|
| 12.03.2011, 14:57 [ТС] | |
|
мы говорим о разном.
plugin_object - это базовый абстрактный тип. он нужен для того, чтоб обязать кодера переопределить его методы. plugin_loader::instance() - возвращает указатель на базовый тип. это нужно для того чтоб можно было получить информацию о плагине. type1 - это и есть реализация, которая определяет поведение плагина. в данном примере, она варит плюшки. так же, в приложение я могу добавить плагин который будет жарить пельмени. тут главное, что при помощи plugin_loader::instance() я получаю указатель на базовый тип, и могу его кастовать к нужному, именно потому, что плагин и его лоадер ничего не знают о внутренней реализации. Добавлено через 55 секунд другими словами: это типичный динамический полиморфизм.
0
|
|
|
22 / 22 / 2
Регистрация: 06.12.2010
Сообщений: 125
|
|
| 12.03.2011, 15:44 | |
|
видимо, надо мне взять и написать howto по теме экспорта-импорта.
у меня реализована софтина, которая тащит функции из подгружаемых динамически (через dlopen и LoadLibrary, софтина кроссплатформенная) библиотек. причём кроме простого подтаскивания там ещё реализован механизм наследования всех "плагинов" от одной общей динамической библиотеки, в которой сосредоточено "дефолтное" поведение классов. всё это работает, но настроек дофига и мне нужно собраться и просто взять и написать, что и как. а так, если это С++, то классы экспортировать можно. есть некоторые проблемы с экспортом-импортом классов между разными компиляторами(и, увы, они неразрешимы). но если планируется, что юзеры будут использовать совместимые на уровне name mangling компиляторы (например, семейство gcc и icc), то можно не париться и смело экспортировать классы. разница только в этом. тем не менее, даже в случае разных компиляторов классы можно использовать: создать в библиотеке фабрику для создания представителя класса и возвращать указатель на готовый объект. только уничтожаться он также должен в библиотеке. я просто делаю две функции: создать элемент класса и уничтожить его и через вызовы получаю указатель и работаю с ним. собственно, если есть конкретные вопросы, я могу поковырять код и сказать, что к чему. у меня была мысль сделать небольшую статью на эту тему, про грабли и варианты их обхода, но пока просто не хватает времени, ибо пишу огромный и сложный проект.
0
|
|
|
|
||
| 12.03.2011, 16:32 | ||
|
Добавлено через 2 минуты Iron Bug, тут немного не то. Человека заклинило на мысли, что нужно экспортировать класс, а не методы класса (что есть на самом деле функции). Ну нельзя в Си++ экспортировать тип в нормальном понимании этого слова. Теоретически это сделать можно, но это будет не тип языка Си++, а тип некоего виртуального интерпретатора, который будет включен в компилятор Добавлено через 3 минуты niXman, пойми ты простую вещь: плагин должен подключаться к программе без перекомпиляции этой самой программы. В противном случае это не плагин, а обычный кусок программы, реализованный в виде динамической библиотеки
0
|
||
| 12.03.2011, 16:32 | |
|
Помогаю со студенческими работами здесь
20
Как видео с камеры отобразить в браузере без использования сторонних плагинов? Реализовать систему плагинов (модулей), каждый из которых должен работать в отдельном потоке Взаимодействие плагинов с ядром Установка плагинов cppunit + ecut в Eclipse Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|