Потдержка программой плагинов

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
Аватара пользователя
Hastur
Сообщения: 18
Зарегистрирован: 05 авг 2007, 18:09

26 сен 2007, 19:35

Привет. Решил сделать в своей проге потдержку плагинов. Первой мыслью было просто отправлять в длл все сообщения приложения а дллка пусть там уже сама разбирается на это или другое сообщение предусмотрин её функционал. Ещё думалось создать какойнить универсальный com-интерфейс(правда реализовывать не пробовал).
Может у кого есть опыт организации приложения и неограниченного числа плагинов? Посоветуйте плз.
Аватара пользователя
Hastur
Сообщения: 18
Зарегистрирован: 05 авг 2007, 18:09

26 сен 2007, 20:08

в делфи ворде есть док с такой фразой

Возможно 2 подхода к построению такой программы

плагины получают информацию от ядра программы, но сами к ядру не обращаются. Назовём такой подход пассивным. в активном подходе плагины инициируют некоторые события и заставляют ядро их слушаться.

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

Я в принципе и сделал первый вариант но уж слишком неповоротливый только для весьма узкого круга задач и с появлением новой потребнонсти приходиться переписывать ядро, но ведь суть то как раз в том чтобы главный проект был неизменен.

Если можно то по второму подходу подскжите чтонить
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

27 сен 2007, 11:20

А если посмотреть на (изучить) устройство/поддержку плагинов файловой оболочкой FAR? Технология "открыта", документирована.
(чуть подумав) Хотя там, пожалуй, "первый подход" (если говорить в воих терминах :) )
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

24 окт 2007, 10:30

На мой взгляд удобней всего сделать так.
Каждый плагин должен реализовывать интерфейс, допустим IPlugin с двумя функциями
IPlugin.Load(Owner:IUnknown);
IPlugin.Unload;
в ini файле прописать CLSID(ClassID - идентификатор класса) загружаемых плагинов.

При старте системы создавать указанные в ini COM объекты, запрашивать у них интерфейс IPlugin и вызывать метод Load(). В метод Load можно передать:
1) Специальный интерфейс с помощью которого плагин может организовывать работу с системой. (это первый вариант с ограниченным доступом)
2) Интерфейс на саму систему(если таковой имеется конечно), с помощью которого можно управлять системой. (это второй вариант с полным доступом к системе)
При закрытии системы вызывать метод UnLoad в котором необходимо будет отпустить все интерфейсы на систему.
Аватара пользователя
Hastur
Сообщения: 18
Зарегистрирован: 05 авг 2007, 18:09

24 окт 2007, 17:00

Пабло писал(а): 2) Интерфейс на саму систему(если таковой имеется конечно), с помощью которого можно управлять системой. (это второй вариант с полным доступом к системе)
При закрытии системы вызывать метод UnLoad в котором необходимо будет отпустить все интерфейсы на систему.
А что ты понимаешь под "...отпустить все интерфейсы на систему"?
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

24 окт 2007, 17:34

Я понимаю под этим, присвоить nil всем переменным класса которые имеют тип данных интерфейс.
Т.е. допустим ты в своем плагине хранил переданный тебе в методе Load интерфейс, в переменной класса FOwner:IUnknown, то в методе Unload ты должен этой переменной присвоить nil.
Ответить