Статическая и динамическая загрузка DLL с Delphi

DLL (Dynamic Link Library) действует как общая библиотека функций, которые могут вызываться многочисленными приложениями и другими DLL. Delphi позволяет вам создавать и использовать библиотеки DLL так что вы можете вызывать эти функции по своему желанию. Однако вы должны импортировать эти подпрограммы, прежде чем сможете их вызвать.

Функции, экспортируемые из DLL, можно импортировать двумя способами: либо объявив внешнюю процедуру или функцию (статическую), либо путем прямого вызова специфичных для DLL функций API (динамическая).

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

После того, как у вас есть circle.dll, вы можете использовать экспортированную функцию «CircleArea» из вашего приложения.

Статическая нагрузка

Самый простой способ импортировать процедуру или функцию - объявить ее с помощью внешней директивы:

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

instagram viewer

Динамическая загрузка

Вы можете получить доступ к подпрограммам в библиотеке через прямые вызовы Win32 API, включая LoadLibrary, FreeLibrary, и GetProcAddress. Эти функции объявлены в Windows.pas.

Вот как вызвать функцию CircleArea с помощью динамической загрузки:

При импорте с использованием динамической загрузки DLL не загружается до вызова LoadLibrary. Библиотека выгружается позвонить в FreeLibrary.

При статической загрузке DLL загружается, и ее секции инициализации выполняются до выполнения секций инициализации вызывающего приложения. Это полностью изменено с динамической загрузкой.

Вы должны использовать статический или динамический?

Вот простой взгляд на преимущества и недостатки статической и динамической загрузки DLL:

Статическая нагрузка

Плюсы:

  • Проще для начинающего разработчика; нет "некрасиво" Вызовы API.
  • DLL загружаются только один раз, когда программа запускается.

Минусы:

  • Приложение не запустится, если какие-либо библиотеки DLL отсутствуют или не могут быть найдены. Появится сообщение об ошибке, подобное этому: "Не удалось запустить данное приложение, так как не найден файл" missing.dll ". Переустановка приложения может решить проблему". По своей структуре порядок поиска DLL со статическим связыванием включает каталог, из которого приложение загружен, системный каталог, каталог Windows и каталоги, перечисленные в среде PATH переменная. Также обратите внимание, что порядок поиска может отличаться для разных версий Windows. Всегда ожидайте наличия всех библиотек DLL в каталоге, где находится вызывающее приложение.
  • Используется больше памяти, так как загружаются все библиотеки DLL, даже если вы не будете использовать некоторые из функций .functions

Динамическая загрузка

Плюсы:

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

Минусы:

  • Требуется больше кода, что не всегда легко для начинающего разработчика.
instagram story viewer