Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 11.pptx
Скачиваний:
94
Добавлен:
18.02.2023
Размер:
105.67 Кб
Скачать

Лекция 11

Разработка динамически компонуемых библиотек (DLL)

Понятие DLL

DLL (англ. Dynamic Link Library — «библиотека динамической компоновки», «динамически подключаемая библиотека») в операционных системах Microsoft Windows и IBM OS/2 — динамическая библиотека, позволяющая многократное использование различными программными приложениями. K DLL относятся также элементы управления ActiveX и драйверы. В системах UNIX аналогичные функции выполняют так называемые общие объекты (англ. shared objects).

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

DLL — это библиотека, содержащая код и данные, которые могут использоваться более чем одной программы одновременно. Например, в операционных системах Windows, библиотека Comdlg32 выполняет общие функции, связанные с диалоговыми окнами. Таким образом каждая программа может использовать функцию, которая содержится в этой библиотеке DLL для реализации диалогового окна

Открыть.

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

Прикладной программный интерфейс Windows (API) осуществляется как набор динамически подключаемых библиотек (DLL), таким образом любой процесс, который использует Windows API, использует динамическое связывание.

Некоторые из файлов, которые реализованы в виде библиотеки DLL в операционных системах Windows:

Файлы элементов управления ActiveX (.ocx)

Примером элемента управления ActiveX является элемент управления календаря, который позволяет выбрать дату с помощью календаря.

Файлы панели (.cpl) элементов управления

Пример файла .cpl — элемент, который расположен на панели управления.

Файлы драйвера (.drv) устройства

Пример драйвера устройства — драйвер принтера, управляет печатью на принтере.

Преимущества DLL

Преимущества, которые предоставляются, когда программа использует библиотеку DLL:

Программа использует меньше ресурсов

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

Обеспечивается модульная архитектура

Библиотека DLL способствует разработке модульных программ.

Библиотека облегчает развертывание и установку приложения

Если функции в библиотеке DLL требуется обновление или исправление, для развертывания и установки библиотеки DLL не требуется программу повторно связывать с библиотекой DLL.

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

Приложение реализует динамическое связывание во время загрузки за счет указания имен процедур из DLL непосредственно в исходном коде. Компоновщик вставляет ссылки на эти процедуры при их обнаружении в связанной с приложением библиотеке импорта либо через раздел IMPORTS файла определений модуля для данного приложения. Во время выполнения приложения, загрузчик Windows помещает DLL-библиотеки в память и разрешает эти ссылки.

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

Когда система начинает программу, которая использует выполняемую при загрузке динамическую связь, используется информация помещенная в файл компоновщиком, чтобы определить местонахождение имен DLL, которые используются процессом. Затем система определяет DLL-ы. Используемый порядок поиска зависит от значения ключа реестра

HKLM\System\CurrentControlSet\Control\Session Manager\ SafeDllSearchMode

Заданное по умолчанию значение ключа равняется 0.

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

Система вызывает функцию точки входа. Функция получает код, указывающий, что процесс загружает DLL. Если функция точки входа не возвращает значение ИСТИНА (TRUE), система завершает работу процесса и сообщает об ошибке.

Наконец, система изменяет таблицу адресов функций стартовыми адресами импортируемых функций DLL.

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

Если SafeDllSearchMode равно 1, порядок поиска происходит как указано ниже:

Каталог из которого загружалось приложение.

Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.

16-разрядный системный каталог. Функции, которая получает путь к этому каталогу нет, но он ищется.

Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.

Текущий каталог.

Каталоги, которые внесены в список в переменной окружения PATH.

Если SafeDllSearchMode равно 0, порядок поиска происходит как указано ниже:

Каталог из которого загружалось приложение.

Текущий каталог.

Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.

16-разрядный системный каталог. Функции, которая получает путь к этому каталогу нет, но он ищется.

Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.

Каталоги, которые внесены в список в переменной окружения PATH.

Динамическое связывание во время выполнения

Хотя динамическое связывание во время выполнения преодолевает ограничения такового во время загрузки, этот метод требует большой работы над приложением. Вместо указания DLL-процедур на стадии компиляции приложение использует функции LoadLibrary, LoadLibraryEx, GetProcAddress и FreeLibrary, чтобы задать во время выполнения имена DLL-библиотек и процедур, на которые будут выполняться ссылки.

Кроме того, динамическое связывание во время выполнения позволяет приложению поддерживать функциональные возможности, недоступные на этапе создания приложения. Например, текстовый процессор может предоставлять внутри DLL подпрограммы преобразования файлов различного формата. При использовании динамического связывания во время выполнения возможно добавление новых DLL-библиотек, содержащих подпрограммы преобразования новых форматов, которых не было на момент создания приложения. Поскольку приложение во время выполнения определяет, какие DLL-библиотеки преобразования форматов существуют, в результате установки новых DLL приложение получит возможность использования новых процедур преобразования.

Для извлечения имен существующих DLL приложение применяет функции FindFirstFile и FindNextFile. Затем оно может загрузить каждую DLL, получить адреса процедур преобразования и поместить эти адреса в структуру, которая впоследствии будет задействована в процессе

В обращении к функции GetProcAddress следует указывать адрес подпрограммы, которую необходимо задействовать. Допускается указание имени процедуры в виде ASCII-строки либо порядкового номера. Хотя использование порядковых номеров более эффективно, следует учитывать возможные затруднения.

Подпрограммы в DLL сохраняются в таблице имен. При вычислении ссылок на подпрограммы Windows использует порядковые номера в качестве индекса таблицы. Windows проверяет лишь попадание порядкового номера в диапазон таблицы имен. Если подпрограммам присвоены номера, не образующие непрерывный ряд (другими словами, в нумерации существуют пропуски), можно указать номер, который укладывается в диапазон, но ссылается на неиспользуемую запись. Функция GetProcAddress просто выполнит возврат недопустимой записи таблицы имен. Когда приложение попытается использовать возвращенный адрес, скорее всего возникнет нарушение общей защиты.

Кроме того, если разработчик DLL позволит компоновщику присваивать подпрограммам стандартные порядковые номера, может оказаться, что в новой DLL будет другая схема нумерации. В результате функция выполнит возврат адреса не той процедуры.

Соседние файлы в папке Лекции