Загрузка среды выполнения объекта Delphi с использованием BPL
Вопрос
У меня есть класс в отделении.Обычно, когда я изменил алгоритм его методов, мне приходится его перекомпилировать и поставить патч целиком.Я думаю создать экземпляр класса с использованием 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, они поддерживают плагины и многое другое без дополнительного кода.Поставляется с учебными пособиями и демо-приложением с исходным кодом.