Система Orphus

9 февраля 2009 г.

Создаём систему плагинов, часть 11

Это последняя часть из серии про плагины (смотреть предыдущую часть).

К сожалению, из-за нехватки свободного времени у меня нет возможности закончить этот проект до конца. Поэтому я решил выложить то, что есть на текущий день. Возможно, кто-нибудь это возьмёт и доведёт до ума.

Вот исходники. Можете брать их и делать с ними всё, что только заходите (большая просьба: измените только константу ExportEntryPointName в IntfInit.pas на любую свою).

В архиве полные исходники и готовые исполняемые модули нескольких плагинов и сервера плагинов. Использовались D2007 и D2009. Исходники оставлены в том виде, в каком они были, когда я последний раз над ними работал. Не помню, компилируюся ли они вообще :) Но что-то близко рабочее там должно быть. Готовые модули собраны в полном отладочном режиме - вы можете диагностировать их работу с помощью DebugView.

P.S. Вот ещё один вариант реализации системы плагинов от меня с пояснениями и обсуждением (щёлкнуть по ссылке "Тема" в правом-верхнем углу). В этот раз - на DLL + интерфейсы.

18 комментарий(ев):

Анонимный комментирует...

Жаль. :-( А так хотелось бы увидеть продолжение!

Анонимный комментирует...

Огромное спасибо автору !

GunSmoker комментирует...

Вот тут: http://forum.vingrad.ru/topic-240495.html
есть ещё наработки по теме плагины в виде Delphi-ских bpl с интерфейсами (не bpl как DLL). Там ещё архив с примерами. Но это было до этой серии и вообще не тестировалось. Просто демонстрашка концепции.

Анонимный комментирует...

Жаль что н закончил ведь тема важная и нужная...

alexander.netishin комментирует...

Планируется ли продолжение? Ждем :).

Спасибо за Ваш труд.

vasilega_74 комментирует...

Эх, вот такую бы статью да на C++ Builder.... Тема интересная, но информации по ней не так много, а жаль!!!

GunSmoker комментирует...

К сожалению, я по нулям в C++ вообще и в C++ Builder в частности.

Анонимный комментирует...

Присоединяюсь к alexander.netishin.
Ждем продолжения... :).

Анонимный комментирует...

Здравствуйте, Александр. У меня вопрос насчет передачи параметров в плагин, а точнее 17-ти строк.

В юните ExportPlugin создаю процедуру:
procedure ExportText(const Value1: WideString;const Value2: WideString;const Value3: WideString;const Value4: WideString; ....... const Value16: WideString;const Value17: WideString); safecall;

Но это явно что-то не то. Подскажите, пожалуйста, как лучше предавать эти строки? А также как вернуть данные из плагина в главное приложение после их обработки?

GunSmoker комментирует...

> Подскажите, пожалуйста, как лучше предавать эти строки?

Смотря что вы хотите сделать.

> А также как вернуть данные из плагина в главное приложение после их обработки?

Смотря в каком виде у вас эти данные.

Анонимный комментирует...

Необходимо создать поток в плагине и в этом потоке обрабатывать строковые данные полученные из главного приложения. В потоке будут выполнятся процедуры и функции компонентов Indy.
Затем после получения информации с сервера, передавать строковые данные в приложение.

GunSmoker комментирует...

Я не понимаю, с чем и почему у вас возникли сложности.

В плагине и ядре объявляете новый метод (или функцию - смотря по тому, пишите ли вы на интерфейсах или функциях), принимающий ровно одну строчку (WideString или PChar). В плагине вы её реализуете так: ставите элемент на обработку в очередь для потока и сразу же возвращаете управление. Когда поток закончит обработку, он вызовет функцию ядра, передав ей результаты. Как вы реализуете функцию ядра - зависит от того, что вы собираетесь делать с этими данными.

В любом случае, если у вас возникают такие вопросы, я рекомендую обратиться на форумы по программированию. Здесь не очень подходящее место для этого. Если есть вопросы/уточнения конкретно по циклу постов - тогда пожалуйста. А свои проблемы лучше решать в более подходящем месте.

Анонимный комментирует...

здравствуйте. а есть трансляция этого крутанского блога в livejournal?

GunSmoker комментирует...

Нет, а надо?

Cushy комментирует...

Александр, спасибо за статью - она почти идеальна.
А как начинающий программист: благодарю за исходники. Буду учиться.

r3code комментирует...

Александр, можешь кратко описать какие вопросы отсальись не решенными в рамках этой серии статей?
Это будет, как план для довершения.

GunSmoker комментирует...

А я помню? :) Этой штуке года два.

В общем, серия получилась не столько про плагины, сколько про DLL и пакеты.

Так что "план для довершения", если это можно так назвать - разобрать собственно темы по плагинам. Способы передачи данных (динамических), обмен строками, обработка ошибок, формы в плагинах, callback-функции (плагин дёргает ядро и/или другой плагин). Всё это разжевать и на примерах.

Понятно, приводить хорошо бы в пример современные решения, а не методы пятнадцатилетней давности.

В цикле что-то частями упоминалось, но вскользь.

Александр Алексеев комментирует...

Долгожданное продолжение :)


Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.