Архитектура плагинов
От: Carc Россия https://vk.com/gosha_mazov
Дата: 08.09.04 18:16
Оценка:
Собственно задумал я вставить в свое приложение возможность применения плагинов.
Вроде как обосновано, куча всяких левых задач типа отправка по емейл или экпорта данных, которые впихивать в основной модуль не хочется — потому что, сколько юзеров, столько и требований к подобным возможностям программы. В общем подобные плагины, скорее должны быть именно расширением функциональности приложения (не думаю, что цель это скины или кастомизация пользовательского интерфейса).

Сходил к FARу, посмотрел как у них. В общем-то, остановился на регулярных длл с заданными функциями. Но возникли вопросы.
К примеру, я публикую какой либо плагин-апи, а потом хочу его поменять, как обеспечивать совместимость? Как писать такой апи? Куда примерно ориентироваться? Кто в приложение должен отвечать за функционирование плагинов?

В общем, огромное количество весьма общих вопросов, а что нить почитать на тему идиомы приложение+плагин ничего не удалось найти.

Может многоуважаемый All, что нить подскажет.

PS: приложение MFC6, MDI
Aml Pages Home
Re: Архитектура плагинов
От: iLYA Канада http://www.bizon.org/ilya/
Дата: 08.09.04 18:41
Оценка:
Здравствуйте, Carc, Вы писали:

C>Собственно задумал я вставить в свое приложение возможность применения плагинов.

...
C>PS: приложение MFC6, MDI

Прю...
Посмотри как это сделано у Миранды. Исходники доступны

iLYA
Re[2]: Архитектура плагинов
От: Carc Россия https://vk.com/gosha_mazov
Дата: 08.09.04 18:43
Оценка:
Здравствуйте, iLYA, Вы писали:

LYA>Здравствуйте, Carc, Вы писали:


C>>Собственно задумал я вставить в свое приложение возможность применения плагинов.

LYA>...
C>>PS: приложение MFC6, MDI

LYA>Прю...

LYA>Посмотри как это сделано у Миранды. Исходники доступны

LYA>iLYA

урл можно?
Aml Pages Home
Re[3]: Архитектура плагинов
От: Twirl Швеция  
Дата: 08.09.04 18:44
Оценка:
Здравствуйте, Carc, Вы писали:

LYA>>Прю...

LYA>>Посмотри как это сделано у Миранды. Исходники доступны

LYA>>iLYA

C>урл можно?

http://www.google.com/search?q=miranda
Re: Архитектура плагинов
От: aka50 Россия  
Дата: 08.09.04 21:13
Оценка:
Здравствуйте, Carc, Вы писали:

C>В общем, огромное количество весьма общих вопросов, а что нить почитать на тему идиомы приложение+плагин ничего не удалось найти.


Потому, что эту пробему обычно решают кто во что горазд

Вот несколько вариантов:
1. Готовый велосипед, причем кросплатформенный и с исходниками: http://www.unitedbytes.de/go.php?site=spl
2. СОМ технология: http://www.rsdn.ru/article/com/introcom.xml
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.

3. Заранее заданный список возможных операций плагина, экспортируемый из DLL.
4. Через специальные струтуры PluginDescriptor с одинаковым для всех именем, в которых
содержатся экспортируемые/ипортируемые функции. Каждой функции ставится в соотвествие
ее версия, имя и указатель на функцию для экспортируемых и указатель на указатель на
функцию для импорта. Загрузчик ищет эту структуру, производит разрешение зависимостей.
При этом он должен держать список всех загруженных плагинов и всех доступных функций.
Re: Архитектура плагинов
От: Аноним  
Дата: 09.09.04 05:04
Оценка: 13 (2)
Здравствуйте, Carc, Вы писали:

C>Собственно задумал я вставить в свое приложение возможность применения плагинов.



Одно из сымых грамотных решений, которое я видел:

http://www.icsharpcode.net/TechNotes/ProgramArchitecture.pdf


Собственно сам проект:

http://www.icsharpcode.net/OpenSource/SD/Default.aspx
Re[2]: Архитектура плагинов
От: Carc Россия https://vk.com/gosha_mazov
Дата: 09.09.04 10:49
Оценка:
Здравствуйте, 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
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.

хм.. я в общем то отказался по след. причинам 1) я не очень хорошо знаю ком (в общем большее количество тонкостей я не знаю) 2) исходя из 1 мне ведь придеться писать сервер (в том смысле мой плагин-апи заказывает правила игры), а следовательно отвественность серьезная... Хотя общее впечатление, что именно КОМ для этого лучше всего подходит.
A>3. Заранее заданный список возможных операций плагина, экспортируемый из DLL.
ну вот что-то видимо вроде этого + динамическая линковка
A>4. Через специальные струтуры PluginDescriptor с одинаковым для всех именем, в которых
A>содержатся экспортируемые/ипортируемые функции. Каждой функции ставится в соотвествие
A>ее версия, имя и указатель на функцию для экспортируемых и указатель на указатель на
A>функцию для импорта. Загрузчик ищет эту структуру, производит разрешение зависимостей.
A>При этом он должен держать список всех загруженных плагинов и всех доступных функций.
Вот вроде этого, т.е. плагин будет обязан предоставить информацию (кто, что, кого и как умеем). Но вот сразу появился такой момент:
например есть два апи один для проверки орфографии, другой к примеру для обхода дерева (в основном приложении некое дерево обьектов слева, справа информация о конкретном обьекте). Как сделать чтобы одна длл, содержала два или более расширения (ну по сути две или более реализаций апи, именно целевых, кроме всяких служебно-обязательных GetPluginInfo) я в общем то как то вижу. А вот что делать в пользовательском интерфейсе программы? К примеру пользователь нажал кнопку "Супер Плагин — Поехали" — к какой обращаться? Не диалог же выводить, чего хотите (ну точно лишний клик), или по сути должна быть некая GetPluginInfoFunc которая из плагина возвращает к примеру название меню, и адресок функции кого звать ну и тип понятное дело (через какой нить энум к примеру)!?!
Aml Pages Home
Re[3]: Архитектура плагинов
От: aka50 Россия  
Дата: 09.09.04 17:12
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, aka50, Вы писали:


A>>2. СОМ технология: http://www.rsdn.ru/article/com/introcom.xml
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.

C>хм.. я в общем то отказался по след. причинам 1) я не очень хорошо знаю ком (в общем большее количество тонкостей я не знаю) 2) исходя из 1 мне ведь придеться писать сервер (в том смысле мой плагин-апи заказывает правила игры), а следовательно отвественность серьезная... Хотя общее впечатление, что именно КОМ для этого лучше всего подходит.
Зато подучишься ... хотя с приходом .NET и написании только под win, ИМХО лучше уж
на С# перейти (тем более может когданить mono все-таки доделают)

<skip>

C> т.е. плагин будет обязан предоставить информацию (кто, что, кого и как умеем). Но вот сразу появился такой момент:

C>например есть два апи один для проверки орфографии, другой к примеру для обхода дерева (в основном приложении некое дерево обьектов слева, справа информация о конкретном обьекте). Как сделать чтобы одна длл, содержала два или более расширения (ну по сути две или более реализаций апи, именно целевых, кроме всяких служебно-обязательных GetPluginInfo) я в общем то как то вижу. А вот что делать в пользовательском интерфейсе программы? К примеру пользователь нажал кнопку "Супер Плагин — Поехали" — к какой обращаться? Не диалог же выводить, чего хотите (ну точно лишний клик), или по сути должна быть некая GetPluginInfoFunc которая из плагина возвращает к примеру название меню, и адресок функции кого звать ну и тип понятное дело (через какой нить энум к примеру)!?!

Читать про паттерны, там все написано .
http://c2.com/cgi/wiki?DesignPatterns

В данном случае:
Проверка орфографии — типичный паттерн "стратегия" http://home.earthlink.net/~huston2/dp/strategy.html
Обход дерева — hierarhical visitor http://c2.com/cgi/wiki?HierarchicalVisitorPattern.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.