Как я могу вызвать функции Delphi в bpl из исполняемого файла?
У меня есть приложение Delphi, для которого я написал довольно простую оболочку.exe.
По сути, был dll, в котором было множество функций, одну из которых я бы вызывал многократно, как только моя оболочка сделала то, что ей было нужно. Я не контролирую этот файл DLL, и никогда не буду.
Ну, теперь эта DLL является BPL, и я не уверен, как вызывать функции в этом файле. Заранее спасибо.
3 ответа
Самый простой способ использовать функции из пакета - это "использовать" модуль, содержащий функцию, вызывать ее как обычно и помещать пакет в список пакетов времени выполнения вашего проекта. Чтобы это работало, есть несколько требований:
- Ваш проект должен использовать ту же версию Delphi, которая использовалась для компиляции пакета.
- У вас должен быть доступ к файлу DCU для устройства или как минимум к файлу DCP для пакета.
- Пакет должен существовать в пути поиска операционной системы при запуске вашей программы.
Если вы не можете выполнить третье требование или не хотите, чтобы пакет загружался постоянно, вы можете позвонить LoadPackage
вместо этого. Чтобы сделать эту работу, нужно иметь другой пакет, который загружается постоянно. Он будет использоваться как вашим проектом, так и пакетом, который вы хотите загрузить. Промежуточный пакет будет предоставлять интерфейс (например, некоторые функции регистрации, переменную или класс), который основной пакет может использовать, чтобы сообщить приложению, каковы его функции. Вы не сможете "использовать" модуль основного пакета в вашем приложении напрямую.
Если вы не можете удовлетворить первые два требования, то есть гораздо более сложный путь, который вам также понадобится, если ваше приложение написано не на 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.