powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как пишутся приложения с плагинами?
15 сообщений из 15, страница 1 из 1
как пишутся приложения с плагинами?
    #36164318
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно сабж. Как реализовать поддержку плагинов в своей программе, какова вообще "технология" написания такого рода программ и самих плагинов. У кого какие идеи? :)
...
Рейтинг: 0 / 0
как пишутся приложения с плагинами?
    #36164624
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое что пришло в голову: наборы регистрируемых колбэков.

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

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

- встраивание в основную программу транслятор с какого-нибудь языка.
Пример: MS Office, Emacs, MathLab.
...
Рейтинг: 0 / 0
как пишутся приложения с плагинами?
    #36165165
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е как я понял, основной способ - это включить в библиотеку набор заранее известных функций, независимо от того, как они будут, просто в куче, или обёрнуты в классы. А можно поподробней про регистрируемые колбэки?
...
Рейтинг: 0 / 0
как пишутся приложения с плагинами?
    #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
как пишутся приложения с плагинами?
    #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
как пишутся приложения с плагинами?
    #36166250
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение, таким образом, ничего о плагинах знать не будет (соблюдаем Open-Closed Principle).
Мне кажется приложение наоборот должно знать о плагине, например, делаю я сейчас какую либо систему, которая работает с базой данных, изначально система работает только с Postgres, а если я захотел добавить поддержку скажем Oracle, тогда послее загрузки плагина, моя система должна знать о нём, т.е она должна знать, что теперь может располагать свои данные в базе Oracle...
...
Рейтинг: 0 / 0
как пишутся приложения с плагинами?
    #36166617
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowМне кажется приложение наоборот должно знать о плагине, например, делаю я сейчас какую либо систему, которая работает с базой данных, изначально система работает только с Postgres, а если я захотел добавить поддержку скажем Oracle, тогда послее загрузки плагина, моя система должна знать о нём, т.е она должна знать, что теперь может располагать свои данные в базе Oracle...
Скажем так: максимум, что приложение должно знать о плагине -- это то, что он есть. Плюс, возможно, оно может давать пользователю возможность выбрать, какой плагин использовать. В дальнейшем же приложение работает с соответсвующим IDatabasePlugin и больше ничего его не интересует.
...
Рейтинг: 0 / 0
как пишутся приложения с плагинами?
    #36167136
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.codeplex.com/MEF
...
Рейтинг: 0 / 0
как пишутся приложения с плагинами?
    #36167266
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем так: максимум, что приложение должно знать о плагине -- это то, что он есть. Плюс, возможно, оно может давать пользователю возможность выбрать, какой плагин использовать. В дальнейшем же приложение работает с соответсвующим IDatabasePlugin и больше ничего его не интересует.

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

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


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

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


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