9 февраля 2009 г.

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

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

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

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

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

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

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

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

    ОтветитьУдалить
  2. Огромное спасибо автору !

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

    ОтветитьУдалить
  4. Анонимный2 июня 2009 г., 12:08

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

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

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

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

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

    ОтветитьУдалить
  8. Присоединяюсь к alexander.netishin.
    Ждем продолжения... :).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ОтветитьУдалить
  16. А я помню? :) Этой штуке года два.

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

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

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

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

    ОтветитьУдалить

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

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

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

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

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