Здавалка
Главная | Обратная связь

Глава 7. Динамически подключаемые библиотеки



Динамически подключаемые библиотеки (Dynamic Link Library, DLL) являются хранилищем общедоступных ресурсов и функций. Механизм DLL-библиотек появился вместе с ОС Windows и является ее неотъемлемой частью.

Ниже перечислены основные достоинства DLL [3, 465 с].

1. Расширение функциональности приложения. DLL можно загружать в адресное пространство процесса динамически, то есть во время исполнения приложения. Это дает возможность предусмотреть возможность расширения функциональности приложения в будущем.

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

3. Экономия оперативной памяти. Если одну и ту же DLL используют несколько приложений, в оперативной памяти может храниться только один ее экземпляр, доступный этим приложениям.

4. Повторное использование кода. При разработке программного продукта определенную часть кода можно вынести в отдельную DLL. В последующем, при разработке новых проектов, можно использовать уже существующие наработки (DLL).

Адресное пространство процесса

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

1. Создает виртуальное адресное пространство для нового процесса и проецирует на него исполняемый модуль.

2. Анализирует раздел импорта исполняемого модуля, находит все необходимые DLL-модули и проецирует их на адресное пространство процесса.

3. Для каждой загружаемой DLL повторяет пункты 2 и 3.

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

Экспорт и импорт

Под экспортом функций понимается предоставление DLL-модулем некоторой части описанных в нем функций в использование другим исполняемым модулям. При написании экспортируемых функций они, как правило, помечаются специальным модификатором, который позволяет компилятору определить, какие функции являются экспортируемыми. Вид модификатора зависит от реализации компилятора и языка программирования, например, при разработке на Microsoft Visual C++ экспортируемые функции помечаются модификатором __declspec(dllexport):

extern "C" __declspec(dllexport) void ShowDialog(char text[], char caption[])

{

MessageBox(NULL, text, caption, MB_OK);

}

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

Таким образом, при формировании DLL-модуля компилятор, на основе имеющейся информации, формирует таблицу экспортируемых идентификаторов – раздел экспорта (export section), в котором содержится список (в алфавитном порядке) идентификаторов экспортируемых функций.

В приложении, в котором происходит обращение к функциям, определенным в DLL, эти функции должны быть объявлены, как импортируемые. Здесь также все зависит от реализации компилятора и языка программирования. При разработке на Microsoft Visual C++ импортируемые функции помечаются модификатором __declspec(dllimport):

extern "C" __declspec(dllimport) void ShowDialog(char text[], char caption[]);

Разрешая ссылки на импортируемые идентификаторы, компилятор создает в конечном модуле раздел импорта (import section). В нем перечисляются DLL, необходимые этому модулю, и идентификаторы, на которые есть ссылки из всех используемых DLL.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.