Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как пишутся приложения с плагинами? / 15 сообщений из 15, страница 1 из 1
26.08.2009, 15:47:13
    #36164318
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Собственно сабж. Как реализовать поддержку плагинов в своей программе, какова вообще "технология" написания такого рода программ и самих плагинов. У кого какие идеи? :)
...
Рейтинг: 0 / 0
26.08.2009, 17:47:36
    #36164624
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
первое что пришло в голову: наборы регистрируемых колбэков.

4 8 15 16 23 42
...
Рейтинг: 0 / 0
26.08.2009, 21:22:08
    #36164918
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
На сегодня есть три основных подхода:
- динамические библиотеки с жестко заданными именами экспортируемых функций
Пример: FAR, TotalCommander

- динамические библиотеки с классами реализующими несколько жестко определенных интерфейсных методов которые в свою очередь описывают реальные функции.
Например: ActiveX, Qt.

- встраивание в основную программу транслятор с какого-нибудь языка.
Пример: MS Office, Emacs, MathLab.
...
Рейтинг: 0 / 0
27.08.2009, 07:29:33
    #36165165
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Т.е как я понял, основной способ - это включить в библиотеку набор заранее известных функций, независимо от того, как они будут, просто в куче, или обёрнуты в классы. А можно поподробней про регистрируемые колбэки?
...
Рейтинг: 0 / 0
27.08.2009, 12:20:32
    #36165805
M_Fighter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Если по простому:

Делаешь 3 функции: InitPlugin, FreePlugin, GetInterface. Эти функции должны поддерживаться всеми плагинами. В Init/Free делаешь что хочешь, в GetInterface возвращаешь структуру, известную основному приложению:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
typedef void (__stdcall *SomeFunc) (int nSomeParam);
...

struct SInterface
{
      SomeFunc pOnFileOpen;
      SomeFunc pSomeOtherHandler;
};

В плагине:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// interface.cpp
SInterface g_Interface;

void InitPlugin()
{
    g_Iterface.pOnFileOpen = &OnFileOpen; // real func
    g_Interface.pSomeOtherHandler = NULL; // не будем обрабатывать
}

SInterface *GetInterface()
{
     return &g_Interface; 
}

В проге:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// при старте приложения
// find all dll's
// foreach
LoadLibrary, GetProcAddress (InitPlugin, FreePlugin, GetInterface)

pInitPlugin();
SInterface *p = pGetInterface();
vecPlugins.push_back(p);

....
//
// где-то в программе
void CMainDlg::OnFileOpen()
{
 // бежим итератором по плагинам и дергаем соотв. функцию
//foreach plugin
if((*it)->pOnFileOpen != NULL)
   (*it)->pOnFileOpen(szFileName);

}
...
Рейтинг: 0 / 0
27.08.2009, 13:15:09
    #36166018
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Прежде всего стоит понять, что плагин сам по себе не существует. Для того, чтобы он выполнял что-то полезное нужна полноценая интегрирация с приложением-хостом. Другими словами, на одних коллбэках далеко не уедешь. Понадобилось, к примеру, вашему плагину вывести какой-нибудь текст в статусную строку приложения. Как это осуществить? Конечно, можно на каждый чих делать коллбэк и по любому поводу опрашивать все плагины "а не хочешь ли ты мне что-нибудь сказать-показать?", но это тупиковый путь.

Правильно будет все провернуть следующим образом: приложение-хост само по себе состоит из набора "сервисов", доступных извне. Этими сервисами и будут пользоваться плагины. Приложение, таким образом, ничего о плагинах знать не будет (соблюдаем Open-Closed Principle). А в случае возникновения каких-то событий приложение будет публиковать уведомления с использованием обобщенного агрегатора событий.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
interface IServiceProvider
{
    T GetService<T>();
}

interface IPlugin
{
    void Initialize(IServiceProvider serviceProvider);
    void Shutdown();
}

class StatusBarTextCapitalizerPlugin : IPlugin
{
    private IStatusBar statusBar;
    
    void Initialize(IServiceProvider serviceProvider)
    {
        IEventAggregator aggregator = serviceProvider.GetService<IEventAggregator>();
        statusBar = serviceProvider.GetService<IStatusBar>();
        
        aggregator.Subscribe(this, typeof(StatusBarTextChangedEvent));
    }
    
    void Receive(StatusBarTextChangedEvent e)
    {
        statusBar.Text = statusBar.Text.ToUpper();
    }
}
...
Рейтинг: 0 / 0
27.08.2009, 14:36:21
    #36166250
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Приложение, таким образом, ничего о плагинах знать не будет (соблюдаем Open-Closed Principle).
Мне кажется приложение наоборот должно знать о плагине, например, делаю я сейчас какую либо систему, которая работает с базой данных, изначально система работает только с Postgres, а если я захотел добавить поддержку скажем Oracle, тогда послее загрузки плагина, моя система должна знать о нём, т.е она должна знать, что теперь может располагать свои данные в базе Oracle...
...
Рейтинг: 0 / 0
27.08.2009, 16:44:34
    #36166617
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
I dont knowМне кажется приложение наоборот должно знать о плагине, например, делаю я сейчас какую либо систему, которая работает с базой данных, изначально система работает только с Postgres, а если я захотел добавить поддержку скажем Oracle, тогда послее загрузки плагина, моя система должна знать о нём, т.е она должна знать, что теперь может располагать свои данные в базе Oracle...
Скажем так: максимум, что приложение должно знать о плагине -- это то, что он есть. Плюс, возможно, оно может давать пользователю возможность выбрать, какой плагин использовать. В дальнейшем же приложение работает с соответсвующим IDatabasePlugin и больше ничего его не интересует.
...
Рейтинг: 0 / 0
28.08.2009, 00:07:11
    #36167136
belugin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
http://www.codeplex.com/MEF
...
Рейтинг: 0 / 0
28.08.2009, 08:09:18
    #36167266
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Скажем так: максимум, что приложение должно знать о плагине -- это то, что он есть. Плюс, возможно, оно может давать пользователю возможность выбрать, какой плагин использовать. В дальнейшем же приложение работает с соответсвующим IDatabasePlugin и больше ничего его не интересует.

хм... логично...

Немного по коду:
Код: plaintext
1.
2.
3.
4.
5.
interface IServiceProvider
{
    T GetService<T>();
}


Что должен будет возвращать такой сервис-провайдер? Доступ к какой-либо части программы? например указатель на Toolbar или указатель на какую либо функцию...
...
Рейтинг: 0 / 0
28.08.2009, 13:29:38
    #36167962
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
I dont knowЧто должен будет возвращать такой сервис-провайдер? Доступ к какой-либо части программы? например указатель на Toolbar или указатель на какую либо функцию...
Ссылку/указатель (зависит от терминологии) на строго определенный интерфейс. В примере с Toolbar'ом -- это будет не указатель на объект приложения Toolbar, а некий интерфейс IToolbarManagerService, предоставляющий API по работе с этой самой панелью инструментов. Это сделано потому, что класс Toolbar -- деталь реализации приложения; класс может поменяться (или вовсе исчезнуть -- например, с заменой на Ribbon) в последующих версиях и его использование внесет в плагин зависимость на библиотеку для разработки UI.

И да, в случае .NET проще всего использовать упомянутый MEF.
...
Рейтинг: 0 / 0
28.08.2009, 14:10:41
    #36168054
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Не, как раз всё на С/С++ :)
...
Рейтинг: 0 / 0
28.08.2009, 14:14:44
    #36168064
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Ну тогда либо использовать COM (если Windows), либо изобретать свой аналог оного, более легковесный. Сама идея остается без изменений.
...
Рейтинг: 0 / 0
28.08.2009, 14:26:54
    #36168091
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Тут изначально под Linux приложение в виде демона(может быть потом портирую на Win), а к нему уже пользователи подключаться будут, через клиентскую прогу(и будут с этим демоном командами обмениваться). К этому приложению система плагинов и нужна, малоли чего потом пользователям захочется.
...
Рейтинг: 0 / 0
28.08.2009, 14:30:52
    #36168106
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пишутся приложения с плагинами?
Но суть в общем понятна, спасибо :)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как пишутся приложения с плагинами? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]