Загрузка объекта Delphi Run Time с использованием BPL - PullRequest
3 голосов
/ 09 ноября 2009

У меня есть класс в единице. Обычно, когда я менял алгоритм его методов, мне приходилось его перекомпилировать и доставлять патч целиком. Я думаю, чтобы создать экземпляр класса с использованием DLL. После поиска в delphi.about.com я обнаружил, что вместо использования DLL я могу использовать BPL. Это DLL для Delphi. Проблема в том, что почти все примеры, которые я нашел, говорят только о том, как экспортировать функцию. Я хочу динамически загружать BPL, и всякий раз, когда я заменяю BPL, я могу получить самый последний алгоритм класса, а не только функции, которые я экспортирую.

Статья, которую я прочитал:
- http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
- Система плагинов для приложений Delphi - bpl vs dll?
- http://delphi.about.com/library/weekly/aa012301a.htm

Любой URL или ОБРАЗЕЦ, как создать BPL с нуля, чтобы инкапсулировать компонент или класс, очень приветствуется.


Дорогой Гуру,

Предположим, у меня есть такой код:

unit unitA;

interface

type
  B = class(TObject)
  public
    procedure HelloB;
  end;

  A = class(TObject)
  public
    function GetB: B;
    function HelloA: String;
    procedure Help;
  end;

  implementation

  uses
      Dialogs;

  { B }

   procedure B.HelloB;
   begin
     ShowMessage('B');
   end;

  { A }

  function A.GetB: B;
  begin
    Result := B.Create;
  end;

  function A.HelloA: String;
  begin
    Result := 'Hello, this is A';
  end;

  procedure A.Help;
  begin
    //do something
  end;

  end.

Я хочу экспортировать все открытые методы A. Как сделать это DLL? Как использовать его из другого устройства, куда его импортировать? скажем:

 var a: A;

 a := A.Create;
 a.GetB;
 showMessage(a.HelloA);

A не объявлено в устройстве (оно находится в DLL). Пожалуйста, сообщите.


Hurray. Я получил это прошлой ночью. Все, что мне нужно сделать, - это заставить объект реализовать интерфейс, который используется в модуле вызывающей стороны для перехвата экземпляра объекта, возвращаемого DLL.

Спасибо всем.

Ответы [ 6 ]

4 голосов
/ 10 ноября 2009

Мейсон уже прибил его, но позвольте мне объяснить, почему BPL - это не то, что вы ищете. BPL - это средство для Delphi IDE для загрузки компонентов, которые совместно используют один и тот же диспетчер памяти и RTL. (Идентификация типов работает почти прозрачно с использованием BPL)

Однако зависимости, с которыми вы связаны, почти всегда неприемлемы. За исключением IDE, которая в любом случае не может обрабатывать разные версии RTL и VCL.

Когда вы передаете только ссылки на интерфейсы между вашим приложением и его библиотеками DLL, вам вообще не нужно обмениваться RTL, VCL или общими пакетами.

Это также означает, что вы можете написать некоторые библиотеки DLL на другом языке (C ++, C #, FPC, другая версия Delphi) и по-прежнему использовать объекты. Что может показаться заманчивым, если вы не хотите портировать основное приложение, но по-прежнему хотите использовать существующие библиотеки, недоступные для Delphi или для вашей версии Delphi.

2 голосов
/ 09 ноября 2009

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

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

Теперь удалите все единицы пакета из проекта EXE. Не должно быть подразделений, которые являются участниками обоих проектов. Затем включите флажок «строить с помощью пакетов времени выполнения» в опциях проекта вашего EXE-файла. Добавьте ваш пакет в список имен пакетов, разделенных точкой с запятой. Пакеты RTL и VCL, вероятно, также будут в этом списке.

Скомпилируйте оба проекта, и все готово.

Если вы вносите изменения в реализацию вашего класса, вы можете перекомпилировать только пакет и отправить новую версию клиентам. Программа автоматически получит новые изменения при замене исходного файла новым. Пакет указан в таблице импорта программы, поэтому ОС автоматически загружает файл BPL при загрузке EXE. EXE не нужно запускать специальный код для загрузки пакета.

2 голосов
/ 09 ноября 2009

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

Если вы уже знаете, как должен выглядеть интерфейс объекта, и все, что вы изменяете, это детали реализации, такие как внутренние алгоритмы, вероятно, проще всего было бы заставить ваш класс реализовать интерфейс и поместить его в DLL которая экспортирует функцию, которая возвращает экземпляр этого интерфейса. Таким образом, вам не нужно беспокоиться о том, чтобы разбить ваше приложение на пакеты, что может стать настоящей проблемой.

0 голосов
/ 27 ноября 2009

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

http://www.maf -components.com

0 голосов
/ 09 ноября 2009

BPLs имеют свое использование. Например, если вам нужно создать очень большое приложение, такое как Erp, вам нужно серьезно использовать BPL.

С другой стороны, BPL не несут ответственности за сбой приложений. Плохое использование BPL делает это.

0 голосов
/ 09 ноября 2009

Delphi может создавать DLL для экспорта функций или BPL для экспорта компонента.

Вы можете создать компонент, скомпилировать его (использовать те же настройки компилятора, что и в вашем основном приложении), и Delphi создаст .bpl. Затем импортируйте этот компонент в Delphi и скомпилируйте ваше приложение с этим компонентом в виде пакета.

Мой опыт работы с компонентами, созданными с помощью Delphi 4, показал, что одно большое приложение более надежно, чем приложение с отдельными .bpls. Это был многопоточный сервер, и он работал нормально, если он был скомпилирован автономно, и через некоторое время падал при компиляции с пакетами. Я надеюсь, что новые версии Delphi улучшились в этой области.

Помните об управлении памятью (в приложении не освобождайте память, выделенную в пакете и наоборот) и настройках компилятора.

Если вам нравится about.com, то эта ссылка будет полезна: Введение в пакеты; BPL - это специальные библиотеки DLL!

...