Как я вызываю функции Delphi в месте рождения от исполняемого файла?

Существует ImageJ, который хвастается, чтобы быть

самая быстрая чистая программа

обработки изображений Java в мире, Это может использоваться в качестве библиотеки в другом приложении. Это - архитектура, не является блестящим, но это делает основные задачи обработки изображений.

8
задан Dan 8 September 2009 в 14:20
поделиться

3 ответа

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

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

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

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

10
ответ дан 5 December 2019 в 13:00
поделиться

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

2
ответ дан 5 December 2019 в 13:00
поделиться

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

1
ответ дан 5 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: