Собственно задумал я вставить в свое приложение возможность применения плагинов.
Вроде как обосновано, куча всяких левых задач типа отправка по емейл или экпорта данных, которые впихивать в основной модуль не хочется — потому что, сколько юзеров, столько и требований к подобным возможностям программы. В общем подобные плагины, скорее должны быть именно расширением функциональности приложения (не думаю, что цель это скины или кастомизация пользовательского интерфейса).
Сходил к FARу, посмотрел как у них. В общем-то, остановился на регулярных длл с заданными функциями. Но возникли вопросы.
К примеру, я публикую какой либо плагин-апи, а потом хочу его поменять, как обеспечивать совместимость? Как писать такой апи? Куда примерно ориентироваться? Кто в приложение должен отвечать за функционирование плагинов?
В общем, огромное количество весьма общих вопросов, а что нить почитать на тему идиомы приложение+плагин ничего не удалось найти.
Здравствуйте, iLYA, Вы писали:
LYA>Здравствуйте, Carc, Вы писали:
C>>Собственно задумал я вставить в свое приложение возможность применения плагинов. LYA>... C>>PS: приложение MFC6, MDI
LYA>Прю... LYA>Посмотри как это сделано у Миранды. Исходники доступны
LYA>iLYA
урл можно?
Здравствуйте, Carc, Вы писали:
C>В общем, огромное количество весьма общих вопросов, а что нить почитать на тему идиомы приложение+плагин ничего не удалось найти.
Потому, что эту пробему обычно решают кто во что горазд
3. Заранее заданный список возможных операций плагина, экспортируемый из DLL.
4. Через специальные струтуры PluginDescriptor с одинаковым для всех именем, в которых
содержатся экспортируемые/ипортируемые функции. Каждой функции ставится в соотвествие
ее версия, имя и указатель на функцию для экспортируемых и указатель на указатель на
функцию для импорта. Загрузчик ищет эту структуру, производит разрешение зависимостей.
При этом он должен держать список всех загруженных плагинов и всех доступных функций.
Здравствуйте, aka50, Вы писали:
A>Здравствуйте, Carc, Вы писали:
C>>В общем, огромное количество весьма общих вопросов, а что нить почитать на тему идиомы приложение+плагин ничего не удалось найти.
A>Потому, что эту пробему обычно решают кто во что горазд
A>Вот несколько вариантов: A>1. Готовый велосипед, причем кросплатформенный и с исходниками: http://www.unitedbytes.de/go.php?site=spl
сенкс огромный A>2. СОМ технология: http://www.rsdn.ru/article/com/introcom.xml
хм.. я в общем то отказался по след. причинам 1) я не очень хорошо знаю ком (в общем большее количество тонкостей я не знаю) 2) исходя из 1 мне ведь придеться писать сервер (в том смысле мой плагин-апи заказывает правила игры), а следовательно отвественность серьезная... Хотя общее впечатление, что именно КОМ для этого лучше всего подходит. A>3. Заранее заданный список возможных операций плагина, экспортируемый из DLL.
ну вот что-то видимо вроде этого + динамическая линковка A>4. Через специальные струтуры PluginDescriptor с одинаковым для всех именем, в которых A>содержатся экспортируемые/ипортируемые функции. Каждой функции ставится в соотвествие A>ее версия, имя и указатель на функцию для экспортируемых и указатель на указатель на A>функцию для импорта. Загрузчик ищет эту структуру, производит разрешение зависимостей. A>При этом он должен держать список всех загруженных плагинов и всех доступных функций.
Вот вроде этого, т.е. плагин будет обязан предоставить информацию (кто, что, кого и как умеем). Но вот сразу появился такой момент:
например есть два апи один для проверки орфографии, другой к примеру для обхода дерева (в основном приложении некое дерево обьектов слева, справа информация о конкретном обьекте). Как сделать чтобы одна длл, содержала два или более расширения (ну по сути две или более реализаций апи, именно целевых, кроме всяких служебно-обязательных GetPluginInfo) я в общем то как то вижу. А вот что делать в пользовательском интерфейсе программы? К примеру пользователь нажал кнопку "Супер Плагин — Поехали" — к какой обращаться? Не диалог же выводить, чего хотите (ну точно лишний клик), или по сути должна быть некая GetPluginInfoFunc которая из плагина возвращает к примеру название меню, и адресок функции кого звать ну и тип понятное дело (через какой нить энум к примеру)!?!
C>хм.. я в общем то отказался по след. причинам 1) я не очень хорошо знаю ком (в общем большее количество тонкостей я не знаю) 2) исходя из 1 мне ведь придеться писать сервер (в том смысле мой плагин-апи заказывает правила игры), а следовательно отвественность серьезная... Хотя общее впечатление, что именно КОМ для этого лучше всего подходит.
Зато подучишься ... хотя с приходом .NET и написании только под win, ИМХО лучше уж
на С# перейти (тем более может когданить mono все-таки доделают)
<skip>
C> т.е. плагин будет обязан предоставить информацию (кто, что, кого и как умеем). Но вот сразу появился такой момент: C>например есть два апи один для проверки орфографии, другой к примеру для обхода дерева (в основном приложении некое дерево обьектов слева, справа информация о конкретном обьекте). Как сделать чтобы одна длл, содержала два или более расширения (ну по сути две или более реализаций апи, именно целевых, кроме всяких служебно-обязательных GetPluginInfo) я в общем то как то вижу. А вот что делать в пользовательском интерфейсе программы? К примеру пользователь нажал кнопку "Супер Плагин — Поехали" — к какой обращаться? Не диалог же выводить, чего хотите (ну точно лишний клик), или по сути должна быть некая GetPluginInfoFunc которая из плагина возвращает к примеру название меню, и адресок функции кого звать ну и тип понятное дело (через какой нить энум к примеру)!?!