Динамически компонуемые библиотеки

Страницы работы

Содержание работы

Динамически компонуемые библиотеки

Динамически компонуемые библиотеки (DLL — dynamic link libraries) представляют собой важное средство операционной системы (ОС) Windows. DLL-библиотеки позволяют подключать предварительно созданные модули к операционной системе, что обеспечивает для приложений общий код, создает модульное представление часто используемых функций и способствует расширяемости. ОС Windows сама состоит, в основном, из DLL-библиотек. Любое приложение, где применяется Win32 API, использует функциональные возможности DLL. Приложение может активизировать размещенные в DLL процедуры двумя методами: динамическим связыванием во время загрузки (loadtime dynamic linking) и динамическим связыванием во время выпод-нения (runtime dynamic linking).

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

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

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

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

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

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

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

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

Создание динамически компонуемых библиотек

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

#include <windows.h>

// AddNumbers — это подпрограмма DLL, которую приложение может вызывать.

int AddNumbers( int nl, int n2 )

{

return ( nl + n2 ) ; }

Этот же код может служить подпрограммой обычного приложения. Различия существуют в файле описания модуля (.DEF). Модуль подключения использует файл описания модуля с целью предоставления информации, необходимой для создания DLL. Следующий фрагмент кода иллюстрирует минимальный файл описания модуля для представленного выше примера.

LIBRARY MyDll

EXPORTS

AddNumbers @1

Похожие материалы

Информация о работе