Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 185, средняя оценка - 4.83
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
#1

Теория плагинов - C++

30.04.2010, 17:02. Просмотров 23561. Ответов 40
Метки нет (Все метки)

Всем привет.
Для одной моей проги, нужно реализовать поддержку плагинов.
Плагины предполагаются простенькие, написанные на Си.

То, что плагин, это просто .so файл - понятно.
То, что прога может дергать из .so файла функции - тоже понятно.

1. Непонятно то, как сам плагин сможет дергать функции из программы?
2. Программа написана на С++, но плагины предполагаю писать на Си, во избежания бинарной несовместимости. В этом случае, какие сложности могут возникнуть?
3. Еще непонятно, каким образом "разделять" плагины, ведь их может быть несколько?
4. И еще непонятно, каким образом программе "сообщить" какие функции дергать из конкретного плагина?
5. И еще непонятно, каким образом плагин, сможет дергать функции из другого плагина?

Нужна теоретическая подкова

Благодарен всем откликнувшимся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2010, 17:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Теория плагинов (C++):

Написание плагинов для notepad++ - C++
Добрый день! Есть задача написания плагина для notepad++ - немного модифицировать его графический интерфейс. Ранее плагины писать не...

Г.Шилдт. Теория и практика С++ - C++
Кто-нибудь дайте бесплатную ссылку на книгу: Г.Шилдт. Теория и практика С++. BHV-Санкт-Петербург. 416 стр Please, очень...

Теория оптимизации - C++ Builder
Доброго! В интернете натолкнулся на статью бывалого прогера, который говорит несколько простых правил оптимизации кода Си. Делал опыты по...

Теория автоматов - C++ Builder
Народ, подскажите как сделать вот задачку: V=(a,b,c). Автомат распознает все строки в которой две послдение буквы не совпадают.

комбинаторика и теория вероятности - C++ Builder
Помогите, пожалуйста, решить задачу! Задача: Имитировать перетасовку новой колоды игральных карт в 52 листа многократным применением...

Теория Информации. Код ХАФФМАНА - C++ Builder
Создание программы кодирования и декодирования файла (любого на выбор преподавателя) кодом Хаффмана. Как сказали нужно оформить в...

40
Evg
Эксперт CАвтор FAQ
18891 / 6848 / 498
Регистрация: 30.03.2009
Сообщений: 19,277
Записей в блоге: 30
13.03.2011, 17:08 #31
Цитата Сообщение от niXman Посмотреть сообщение
никак.
если программа не знает интерфейса, значит ей вовсе этот плагин не нужен, т.к. невозможно работать с неизвестным типом.
А почему тогда твоя программа знает про класс type1, который как бы является плагином?
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.03.2011, 17:12  [ТС] #32
Цитата Сообщение от Evg Посмотреть сообщение
почему тогда твоя программа знает про класс type1
эм...
вот ты, для того чтоб выделить память, почему используешь функцию malloc() ?
вот и мне, для того чтоб использовать функционал предоставляемый плагином реализующим type1, нужно знать интерфейс к type1.
0
Evg
Эксперт CАвтор FAQ
18891 / 6848 / 498
Регистрация: 30.03.2009
Сообщений: 19,277
Записей в блоге: 30
13.03.2011, 17:42 #33
Цитата Сообщение от niXman Посмотреть сообщение
вот и мне, для того чтоб использовать функционал предоставляемый плагином реализующим type1, нужно знать интерфейс к type1
Так интерфейсом плагина у тебя является тип i_type. Какого ж фига ты лезешь в type1? И чем использование type1, о котором приложение, вообще говоря, не должно знать, отличается от типа type_evg? Ничем. Я бы сказал это одно и то же

Добавлено через 44 секунды
Цитата Сообщение от niXman Посмотреть сообщение
почему используешь функцию malloc()
Я его использую потому, что он прописан в интерфейсе. А type1 в интерфейсе не прописан
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.03.2011, 18:03  [ТС] #34
Цитата Сообщение от Evg Посмотреть сообщение
Я его использую потому, что он прописан в интерфейсе. А type1 в интерфейсе не прописан
это называется динамический полиморфизм.
т.е. я работаю на основе информации известной из интерфейса.
а из интерфейса я знаю, что у некоторого типа есть некоторые методы. так же знаю, что поведение методов определено не интерфейсом, а его реализацией в плагине.

Добавлено через 2 минуты
Evg, по моему, мы говорим о разном...
0
Evg
Эксперт CАвтор FAQ
18891 / 6848 / 498
Регистрация: 30.03.2009
Сообщений: 19,277
Записей в блоге: 30
13.03.2011, 18:04 #35
Цитата Сообщение от niXman Посмотреть сообщение
это называется динамический полиморфизм.
т.е. я работаю на основе информации известной из интерфейса.
а из интерфейса я знаю, что у некоторого типа есть некоторые методы. так же знаю, что поведение методов определено не интерфейсом, а его реализацией в плагине.
В интерфейсе (класс plugin_object) нет методов set и get.

Добавлено через 45 секунд
Цитата Сообщение от niXman Посмотреть сообщение
Evg, по моему, мы говорим о разном...
Я говорю о том, как правильно делать плагины. О чём говоришь ты, я, если честно, не очень понимаю
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.03.2011, 18:08  [ТС] #36
Цитата Сообщение от Evg Посмотреть сообщение
В интерфейсе (класс plugin_object) нет методов set и get.
потому что он базовый. единственное что реализует plugin_object, так это:
name()
description()
version()

и наследование от этого типа, обязывает реализатора плагина, переопределить эти методы, дабы они возвращали информацию о реализуемом плагине.

Добавлено через 1 минуту
к примеру, я выкину тип plugin_object, и изменю функцию instance() так, чтоб она возвращала указатель на void.
это будет то, о чем говоришь ты?
0
Evg
Эксперт CАвтор FAQ
18891 / 6848 / 498
Регистрация: 30.03.2009
Сообщений: 19,277
Записей в блоге: 30
13.03.2011, 18:18 #37
Цитата Сообщение от niXman Посмотреть сообщение
потому что он базовый. единственное что реализует plugin_object, так это:
name()
description()
version()

и наследование от этого типа, обязывает реализатора плагина, переопределить эти методы, дабы они возвращали информацию о реализуемом плагине.
Вот всё то, что здесь описано, и является интерфейсом. Типа type1, методов set и get в интерфейсе нет, а следовательно, в основной программе их никак нельзя использовать

Цитата Сообщение от niXman Посмотреть сообщение
к примеру, я выкину тип plugin_object, и изменю функцию instance() так, чтоб она возвращала указатель на void.
это будет то, о чем говоришь ты?
Тогда я не очень понимаю, что в итоге-то останется?

Iron Bug приводила ссылку со своей реализацией. Вот там всё было правильно: из главной программы не было никаких обращений, выходящих за рамки интерфейса.

Вот возьми, к примеру, фотошоп. У него куча всяких фильтров (которые выполняют преобразование изображения). Все они реализованы в виде плагинов и могут добавляться к программе (в том числе и от сторонних разработчиков). Интерфейс плагина, в самом примитивном случае состоит из следующего:
- создать экземпляр класса "плагин". Реально создастся экземпляр пронаследованного класса, но он будет отдан программе в виде указателя на базовый класс
- выполнить преобразование картинки: в некий метод, определённый в базовом классе, отдаётся картинка на вход и принимается картинка на выходе.

Главная программа никоим образом не знает о том, через какой класс всё это реализовано внутри плагина. Знает лишь то, что этот класс является производным классом от базового класса плагина. И главная программа пользуется лишь тем интерфейсом, который описан в базовом классе. Никаких Set и get, который в базовом классе нет
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.03.2011, 18:36  [ТС] #38
Цитата Сообщение от Evg Посмотреть сообщение
Вот всё то, что здесь описано, и является интерфейсом. Типа type1, методов set и get в интерфейсе нет
так интерфейсы можно наследовать!

Цитата Сообщение от Evg Посмотреть сообщение
Вот возьми, к примеру, фотошоп. У него куча всяких фильтров (которые выполняют преобразование изображения). Все они реализованы в виде плагинов и могут добавляться к программе (в том числе и от сторонних разработчиков). Интерфейс плагина, в самом примитивном случае состоит из следующего:
- создать экземпляр класса "плагин". Реально создастся экземпляр пронаследованного класса, но он будет отдан программе в виде указателя на базовый класс
- выполнить преобразование картинки: в некий метод, определённый в базовом классе, отдаётся картинка на вход и принимается картинка на выходе.
Главная программа никоим образом не знает о том, через какой класс всё это реализовано внутри плагина. Знает лишь то, что этот класс является производным классом от базового класса плагина. И главная программа пользуется лишь тем интерфейсом, который описан в базовом классе. Никаких Set и get, который в базовом классе нет
это все правильно. но я НЕ хочу использовать такой принцип. почему что-то должно меня ограничивать?!
я хочу чтоб плагин type1.so экспортировал функционал согласно интерфейсу type1. поэтому, я получив от плагина инстанс, кастую его к типу type1*, и работаю с указателем на type1.
одновременно, я хочу юзать плагин type2.so. так же, получаю инстанс, и кастую его к типу type2*, и работаю с указателем на type2.
все. невижу противоречий и нелогичности.
0
Evg
Эксперт CАвтор FAQ
18891 / 6848 / 498
Регистрация: 30.03.2009
Сообщений: 19,277
Записей в блоге: 30
13.03.2011, 18:47 #39
Цитата Сообщение от niXman Посмотреть сообщение
но я НЕ хочу использовать такой принцип. почему что-то должно меня ограничивать?!
По определению. Есть функция qsort, одним из параметров которой является указатель на функцию с конкретно заданным прототипом. И ты обязан придерживаться этого интерфейса независимо от желаний "не хочу что-то ограничивать".

Цитата Сообщение от niXman Посмотреть сообщение
все. невижу противоречий и нелогичности
А я вижу. То, что ты хочешь - НЕ является плагином. А является частью программы, оформленной в виде динамической библиотеки. Эту часть ты можешь вообще отдельным классом реализовать без каких-либо наследований от базового класса.

Я могу реализовать динамическую библиотеку, экспортировать в ней функцию trampampam, в которую передаются два int'а, а она будет возвращать их сумму. Далее могу для вычисления суммы двух чисел подключать эту библиотеку через dlopen и работать через ней. Могу назвать эту библиотеку "плагином". И всё будет работать. За исключением того, что это НЕ будет являться плагином
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.03.2011, 19:00  [ТС] #40
Цитата Сообщение от Evg Посмотреть сообщение
Эту часть ты можешь вообще отдельным классом реализовать без каких-либо наследований от базового класса.
наследование тут нужно чтоб обязать _создателя_плагина_ переопределить методы базового класса.

Цитата Сообщение от Evg Посмотреть сообщение
всё будет работать. За исключением того, что это НЕ будет являться плагином
т.е. все что ты хочешь сказать, так это то, что плагины обязаны соответствовать единому интерфейсу? с этим я не спорю. оно так и есть.
но мне нужна возможность использовать несколько типов интерфейсов обязывая себя знать, какой плагин, какой интерфейс реализует. детали же реализация плагина мне не известны. это мне и требуется.
0
Evg
Эксперт CАвтор FAQ
18891 / 6848 / 498
Регистрация: 30.03.2009
Сообщений: 19,277
Записей в блоге: 30
13.03.2011, 22:05 #41
Цитата Сообщение от niXman Посмотреть сообщение
но мне нужна возможность использовать несколько типов интерфейсов
Значит будет несколько видов плагинов. Если ты от базового типа наследуешь типы type1 и type2, то именно эти два новых типа будут интерфейсами двух видов плагинов, а не базовый тип
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2011, 22:05
Привет! Вот еще темы с ответами:

Dynamic-Link Library: Теория + Практика - C++ Builder
1. Теоретическая часть. Знакомство с Dynamic-Link Library. 1.1. Что такое DLL. 1.2. Использование DLL. 1.3. Необходимость...

Теория защиты презентации (ppt и pptx) - C++ Builder
Добрый день! Озадачили меня на работе написать простую защиту презентаций, выполненных в программе Microsoft PowerPoint. ...

1C 8.x Теория плагинов - 1С
Гуру, обьясните кто сталкивался... Есть плагин на Делфи в виде dll под 1С77 с исходниками. Я сам писал... запись и чтение текстовых...

Теория создания плагинов. - Visual Basic
Нужна информация о создании программ к которым в процессе работы можно было бы подключать plug-in'ы.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru