Шаг 70.
Создание DLL (общие сведения)

    На этом шаге мы приведем общие сведения о DLL.

    Использование динамически подключаемых библиотек (по-другому - библиотек динамической компоновки) - это способ осуществления модульности в период выполнения программы. Динамическая библиотека (Dynamic Link Library, DLL) позволяет упростить и саму разработку программного обеспечения. Вместо того чтобы каждый раз перекомпилировать огромные ЕХЕ-программы, достаточно перекомпилировать лишь отдельный динамический модуль. Кроме того, доступ к динамической библиотеке возможен сразу из нескольких исполняемых модулей, что делает многозадачность более гибкой. Структура исполняемых модулей будет рассмотрена позже, но главное то, что структура DLL-модуля практически такая же, как у EXE-модуля. Тот, кто программировал под MS-DOS, должен быть знаком с понятием оверлея. По своей функциональности динамически подключаемая библиотека очень похожа на оверлей, но название "динамически подключаемая библиотека" более удачно.


    Замечание. Оверлей (Overlay) в переводе означает перекрытие - указание на то, что в оверлейную область памяти могут загружаться по очереди разные части оверлея, перекрывая друг друга.

    При написании ЕХЕ-модулей вы уже познакомились с тем, как определять импортируемые функции. Достаточно объявить эти функции как EXTERN. При создании динамической библиотеки вам придется указывать и импортируемые, и экспортируемые функции.

    Для того чтобы двигаться дальше, введем такое понятие, как связывание. Собственно, мы уже ввели это понятие, когда рассматривали работу редактора связей. Во время трансляции связываются имена, указанные в программе как внешние, (EXTERN) с соответствующими именами из библиотек, которые указываются при помощи директивы IMPORTLIB. Такое связывание называется ранним (или статическим). Напротив, в случае с динамически связываемой библиотекой связывание происходит во время выполнения модуля. Такое связывание называется поздним (или динамическим). При этом позднее связывание может происходить в автоматическом режиме в начале запуска программы и при помощи специальных API-функций, по желанию программиста. При этом говорят о явном и неявном связывании. Сказанное иллюстрирует рисунок 1.


Рис.1. Иллюстрация понятия связывания в Windows

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


    Замечание. Вообще говоря, библиотеки, используемые нами для программирования в Windows, такие как import32.lib, user32.lib и т.п., правильнее называть не статическими библиотеками, а библиотеками импорта. В них нет программного кода, а лишь информация, используемая для трансляции.

    В среде Windows практикуются два механизма связывания:

    В первом случае функция, определенная в DLL, идентифицируется по имени, во втором - по порядковому номеру, который должен быть задан при трансляции. Связывание по порядковому номеру в основном практиковалось в старой операционной системе Windows 3.x. На наш взгляд, связывание по имени - более удобный механизм.

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

    В любой DLL следует определить точку входа (процедура входа). По умолчанию за точку входа принимают метку, указываемую за директивой END (например, END START). При загрузке DLL и выгрузке динамически подключаемой библиотеки автоматически вызывается процедура входа. Заметим при этом, что каким бы способом ни была загружена DLL (явно или неявно), выгрузка DLL из памяти будет происходить автоматически при закрытии процесса или потока. В принципе, процедура входа может быть использована для инициализации переменных в начале выполнения программы. Довольно часто эта процедура остается пустой. При вызове процедуры входа в нее помещаются три параметра:

    Рассмотрим подробнее второй параметр процедуры входа. Вот четыре возможных значения этого параметра:

    На следующем шаге мы рассмотрим создание DLL.




Предыдущий шаг Содержание Следующий шаг