Как лучше всего добавить Сменную Возможность к программе Delphi

14
задан Community 23 May 2017 в 12:24
поделиться

9 ответов

Первый вопрос, который я задал бы, Вам нужны плагины, чтобы получить доступ к UI Вашего хост-приложения или добавить какие-либо собственные элементы UI? Или плагины будут ограничены запросами и/или снабжением данными к Вашему приложению хоста?

последний намного легче и открывает две возможности. Другие уже упомянули DLLs, который является первым способом пойти. Определенные протесты применяются - в целом необходимо соединять интерфейсом с dll с использованием только типов данных, которые используются в Windows API. Тем путем можно быть уверены, что сменный DLLs поймет типы данных, в каком языке/компиляторе они были созданы. (Так, например, используйте PChars, не строки. Как правило, не передавайте классы Delphi, такие как TStream к DLL. Это, будет казаться, будет работать в некоторых случаях, но небезопасно в целом, потому что, даже если DLL был скомпилирован в Delphi, это, возможно, была другая версия компилятора с немного отличающейся идеей того, что TStream). Google для использования DLLs в Delphi, и Вы найдете еще много подсказок.

Иначе, который не был упомянут еще, должен позволить писать сценарий в Вашем приложении самом. Существует несколько очень способных сторонних механизмов выполнения сценариев, и коммерческих и бесплатных, и большинство из них позволяет Вам обмениваться объектами Delphi со сценарием. Некоторые из этих библиотек поддерживают только Паскаля как язык сценариев, другие позволят Вам использовать Основной (возможно, лучше для пользователей новичка) или другие языки. Посмотрите, например, RemObjects Сценарий Паскаля (бесплатный) в http://www.remobjects.com/free.aspx .

Моим любимым решением для сценариев в данный момент является Python для Delphi (P4D, также свободный) от http://mmm-experts.com/Products.aspx?ProductID=3 , Это может взаимодействовать через интерфейс красиво с Вашими классами через RTTI и позволяет Вам выполнять код Python в своем приложении Delphi, а также классы Delphi использования в сценариях Python. Учитывая популярность Python, это может быть эффективным решением, если Вы хотите притянуть разработчиков к своему проекту. Однако каждому пользователю должны будут установить распределение Python.

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

Теперь, назад к моему начальному вопросу: вещи становятся намного более сложными при необходимости в плагинах для взаимодействия с пользовательским интерфейсом, например, путем размещения средств управления в него. В целом DLLs не может использоваться, чтобы сделать это. Путь Borland/CodeGear-sanctioned состоит в том, чтобы использовать пакеты (BPLs). С BPLs можно получить доступ и инстанцировать классов, предлагаемых плагином, как будто они были объявлены в хост-приложении. Выгода, весь BPLs должен быть скомпилирован с той же точной версией и сборкой Delphi, который Ваше главное приложение. По-моему, это делает пакеты абсолютно непрактичными, так как трудно ожидать, что все потенциальные сменные писатели во всем мире будут использовать ту же версию Delphi, который Вы. Главная ловушка.

Для обхождения этого я экспериментировал с другим подходом: продолжайте использовать DLLs и разработайте синтаксис для плагина для описания UI, в котором он нуждается, затем создайте UI сами в приложении хоста. (XML является удобным способом выразить UI, так как Вы получаете понятие порождения / вложение бесплатно.) Синтаксис описания UI может включать обратные вызовы в DLL, инициированный, когда содержание или состояние управления изменяются. Этот метод ограничит плагины набором средств управления VCL, которые Ваше приложение уже использует или зарегистрировало, все же. И это не одно-nighter задание, в то время как BPLs, конечно.

Google для "платформы плагина Delphi", также. Существуют некоторые готовые решения, но насколько я знаю, что они обычно используют BPLs с их ограниченной полноценностью.

10
ответ дан 1 December 2019 в 06:36
поделиться

На самом деле принятый ответ на вопрос Вы цитируете , довольно подходит для Delphi также. Ваши плагины будут DLLs, и можно продиктовать, что они должны экспортировать функцию с определенным именем и подписью. Затем Ваша программа загрузит DLL (LoadLibrary) и получит адрес функции (с GetProcAddress). Если DLL не загружается, или функция не там, то DLL не является плагином для Вашего приложения.

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

При тестировании сменной системы, будет мудро записать плагин самостоятельно с языком кроме Delphi. Тем путем можно быть более уверены, что Вы непреднамеренно не потребовали, чтобы все использовали Delphi.

9
ответ дан 1 December 2019 в 06:36
поделиться

Сначала я пошел для BPL и плагинов основы DLL. И найденный ими трудно для поддержания.

при использовании системы BPL, затем необходимо соответствовать версии BPL версии EXE. Это включает обновления Delphi, которые могут повредить что-то. Я узнал (твердый путь), что, если я должен включать все свои плагины с каждым выпуском, нет никакого смысла в наличии плагинов вообще.

Затем я переключил на плоскость плагины DLL. Но та система просто усложнила кодовую базу. И это не хорошая вещь.

, В то время как выполнение круиза сеть я узнал , Lua встроил язык сценария и поставил с ним. Lua является 150K DLL, встраивая компилятор байт-кода, интерпретатор и очень простой и умный динамический язык программирования.

Мои плагины являются простыми lua сценариями. Легко mantaind и сделанный. Там предварительно сделаны примерами Delphi, таким образом, можно экспортировать любой класс или процедуру как таблица Lua или функция. GUI или нет. Например, у меня был TurboPower Abbrevia в моем приложении для архивирования. Я экспортировал свой класс архивирования в lua, и все плагины теперь могут назвать zip (' . ', 'dir.zip'), и разархивировали (). Затем я переключился на 7zip и только реализовал старый класс для использования 7zip. Все плагины работают, как они сделали с поддержкой новой zip (' . ', 'dir 7z').

я сделал TLuaAction, который вызовы Выполняют (), Обновление (), Подсказка () процедура из ее сценария.

Lua также имеют свою собственную сменную систему, которая помогает добавить funcionality к нему. Например, luacom делают, простая в использовании автоматизация COM, luainterface позволяет называть .NET от lua. См. luaforge для больше. Существует IDE Lua, сделанный в Delphi с источником.

7
ответ дан 1 December 2019 в 06:36
поделиться

Я пытался сделать обзор всех таких опций некоторое время назад. Вместе с моими читателями/комментаторами мы создали этот список:

  • DLL/BPL, загруженный из программы.
  • DLL/BPL, загруженный из песочницы (который мог быть другой копией программы или специализированного приложения "сервера" и который общается с основной программой через messages/sockets/msmq/named файлы каналов/почтовых слотов/с отображенной памятью).
  • COM (в любом из его вариантов).
  • DDE (не).
  • Внешняя программа, которая связывается через stanard ввод/вывод.
  • Внешняя программа, которая связывается через файлы (имя файла является параметром к программе).
  • Внешняя программа, которая работает через папку отбрасывания (полезный для пакетной обработки).
  • Внешняя программа, которая общается с окнами sockets/msmq/named файлы/база данных каналов/почтовых слотов/с отображенной памятью messages/windows, публикует - подписываются.
6
ответ дан 1 December 2019 в 06:36
поделиться

Я использую плагины для реализации большей части функциональности в игровом механизме, который я создаю. Основной EXE очень еще составлен из механизма выполнения сценария, сменного менеджера, некоторых основных графических стандартных программ и не. Я использую TJvPluginManager из библиотеки VCL ДЖЕДАЯ. Это - очень хороший менеджер, и это может добавить примерно что-либо, что Вы хотите к своей программе. Проверьте демонстрации, включенные с пакетом, чтобы видеть, как он работает. Единственный недостаток - то, что это добавляет много кода JCL/JVCL к Вашей программе, но это не действительно проблема, если Вы уже используете другие компоненты JVCL.

4
ответ дан 1 December 2019 в 06:36
поделиться

Самый универсальный метод добавления сменной возможности должен использовать COM. Хорошая книга для запущения Вас на дороге Delphi Программирование Com Eric Harmon. В то время как это было первоначально записано для версий 3 - 5 Delphi, книжное содержание все еще допустимо с последними версиями Delphi.

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

4
ответ дан 1 December 2019 в 06:36
поделиться

Если плагины будут разработаны в Delphi или разработчике C++, используйте пакеты + интерфейсы. Delphi ОТА является хорошим примером для этого. Если плагины будут независимы от языка, COM является хорошим способом пойти.

Дополнение: Если Вы не будете использовать COM, u, возможно, должен обеспечить SDKs для каждого языка. И обработка типа данных между различными языками может быть болью (например, строковый тип Дельфи). Delphi поддержка COM превосходна, Вы не должны волноваться о виде деталей. Это главным образом impilicit с Delphi поддержка COM. Не пытайтесь изобрести колесо снова. Я удивлен, почему люди не склонны упоминать об этом.

2
ответ дан 1 December 2019 в 06:36
поделиться

Вы могли взглянуть на Гидра от Remobjects. Мало того, что это позволит Вам добавлять плагины, но также и смешивать win32 и .NET.

1
ответ дан 1 December 2019 в 06:36
поделиться
2
ответ дан 1 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: