Динамически подключаемые библиотеки (DLL, или динамические библиотеки, или библиотеки динамической компоновки, или модули библиотек) являются одним из наиболее важных структурных элементов Windows. Большинство файлов, из которых состоит Windows, представляют из себя либо программные модули, либо модули динамически подключаемых библиотек. До сих пор мы писали программы для Windows; теперь настала пора заняться написанием динамически подключаемых библиотек. Большая часть принципов, относящихся к написанию программ, вполне подходит и для написания этих библиотек, но есть несколько важных отличий.
Основы библиотек
Как известно, Windows-программа представляет собой исполняемый файл, который обычно создает одно или более окон, а для получения данных от пользователя использует цикл обработки сообщений. Динамически подключаемые библиотеки, как правило, непосредственно не выполняются и обычно не получают сообщений. Они представляют из себя отдельные файлы с функциями, которые вызываются программами и другими динамическими библиотеками для выполнения определенных задач. Динамически подключаемая библиотека активизируется только тогда, когда другой модуль вызывает одну из функций, находящихся в библиотеке.
Термин динамическое связывание (dinamic linking) относится к процессам, которые Windows использует для того, чтобы связать вызов функции в одном из модулей с реальной функцией из модуля библиотеки. Статическое связывание (static linking) имеет место в процессе создания программы, когда для создания исполняемого (.EXE) файла связываются воедино разные объектные (.OBJ) модули, файлы библиотек (.LIB) и, как правило, скомпилированные файлы описания ресурсов (.RES). В отличие от этого, динамическое связывание имеет место во время выполнения программы.
Файлы KERNEL32.DLL, USER32.DLL и GDI32.DLL, файлы различных драйверов, например, KEYBOARD.DRV, SYSTEM.DRV и MOUSE.DRV, драйверы мониторов и принтеров — все это динамически подключаемые библиотеки. Эти библиотеки можно использовать во всех программах Windows.
Некоторые динамически подключаемые библиотеки (например, файлы шрифтов) содержат только ресурсы (resource only). В них содержатся только данные (обычно в виде ресурсов), и нет текстов программ. Таким образом, одной из целью существования динамически подключаемых библиотек должно быть обеспечение функциями и ресурсами, которые можно использовать во многих, совершенно разных программах. В традиционной операционной системе, только сама операционная система содержит программы, которые для решения каких-то задач могут вызывать другие программы. В Windows принцип вызова одним модулем функции из другого модуля, распространен на всю операционную систему. Это приводит к тому, что когда вы пишете динамически подключаемую библиотеку — вы пишете