Урок 14: Использование DLL в Delphi
- Понятие DLL
Вспомним процесс программирования в DOS. Преобразование исходного
текста программы в машинный код включал в себя два процесса – компиляцию
и линковку. В процессе линковки, редактор связей, компоновавший отдельные
модули программы, помещал в код программы не только объявления функций
и процедур, но и их полный код. Вы готовили таким образом одну программу,
другую, третью … И везде код одних и тех же функций помещался в программу
полностью.
В многозадачной среде такой
подход был бы по меньшей мере безрассудным, так как очевидно, что огромное
количество одних и тех же функций, отвечающих за прорисовку элементов пользовательского
интерфейса, за доступ к системным ресурсам и т.п. дублировались бы полностью
во всех приложениях, что привело бы к быстрому истощению самого дорогого
ресурса – оперативной памяти. В качестве решения возникшей проблемы, еще
на UNIX-подобных платформах была предложена концепция динамической компоновки.
Но, чем же отличаются Dynamic
Link Library (DLL) от обычных приложений? Для понимания этого требуется
уточнить понятия задачи (task), экземпляра (копии) приложения (instance)
и модуля (module).
При запуске нескольких экземпляров
одного приложения, Windows загружает в оперативную память только одну копию
кода и ресурсов – модуль приложения, создавая несколько отдельных сегментов
данных, стека и очереди сообщений, каждый набор которых представляет
из себя задачу, в понимании Windows. Копия приложения представляет из себя
контекст, в котором выполняется модуль приложения.
DLL – библиотека, в отличие
от приложения не имеет ни стека, ни очереди сообщений. Функции, помещенные
в DLL, выполняются в контексте вызвавшего приложения, пользуясь его стеком.
Но эти же функции используют сегмент данных, принадлежащий библиотеке,
а не копии приложения.
В силу такой организации
DLL, экономия памяти достигается за счет того, что все запущенные приложения
используют один модуль DLL, не включая те или иные стандартные функции
в состав своих модулей.
Часто, в виде DLL создаются
отдельные наборы функций, объединенные по тем или иным логическим признакам,
аналогично тому, как концептуально происходит планирование модулей ( в
смысле unit ) в Pascal. Отличие заключается в том, что функции из модулей
Pascal компонуются статически – на этапе линковки, а функции из DLL компонуются
динамически, то есть в run-time. Прочитать остальную часть записи »