Загрузка среды выполнения объекта Delphi с использованием BPL

StackOverflow https://stackoverflow.com/questions/1700366

  •  19-09-2019
  •  | 
  •  

Вопрос

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

Статья, которую я прочитал:
- http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
- Система плагинов для приложения Delphi — bpl против 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).Пожалуйста, порекомендуйте.


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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

http://www.maf-comComponents.com

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top