Как вызвать функции Delphi в bpl из исполняемого файла?

У меня есть приложение Delphi, которое я написал довольно простую оболочку .exe для.

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

Ну, теперь эта DLL является BPL, и я не уверен, как вызывать функции в этом файле. Спасибо заранее.

3 ответов


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

  1. ваш проект должен использовать ту же версию Delphi, что и для компиляции пакета.
  2. у вас должен быть доступ к файлу DCU для устройства или, по крайней мере, файл DCP для пакета.
  3. пакет, должен существует в пути поиска операционной системы при запуске программы.

если вы не можете удовлетворить третье требование, или если вы не хотите, чтобы пакет загружается все время, то вы можете позвонить LoadPackage для этого вместо этого. Способ сделать эту работу-иметь другой пакет, который is загружается все время. Он будет использоваться как вашим проектом, так и пакетом, который вы хотите загрузить. Промежуточный пакет будет предоставлять интерфейс (например, некоторую регистрацию функции, переменная или класс), которые основной пакет может использовать, чтобы сообщить приложению, каковы его функции. Вы не сможете "использовать" блок основного пакета в приложение напрямую.

если вы не можете удовлетворить первые два требования, то есть гораздо более сложный способ, который также вам нужно будет сделать, если ваше приложение не написано на Delphi или C++ Builder. Рассматривайте пакет как обычную DLL. Загрузите его с LoadLibrary. Использовать GetProcAddress загрузить Initialize функция, а затем вызовите ее. (Помните, что соглашение о вызове register, а не stdcall.) Затем загрузите адрес функции, которую вы хотите вызвать, имея в виду, что имя функции было искажено, чтобы включить некоторую информацию о единице и типе. Вызовите Finalize функция перед вызовом FreeLibrary. Проверьте источник для LoadPackage и UnloadPackage; если вам нужно позвонить CheckForDuplicateUnits вероятно, зависит от того, можете ли вы удовлетворить требование № 1.


BPL - это просто DLL с несколькими конкретными дополнениями к нему. У вас не должно быть проблем с вызовом функций из него, как и с DLL, с одним конкретным предостережением: BPL должен быть построен в той же версии Delphi, что и вы используете. Это может быть серьезным недостатком, если у вас нет исходного кода. Если это проблема для вас, вы, вероятно, должны поговорить с тем, кто его создал, и попросить их вернуть его в DLL.


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