Глава 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 Все права принадлежат авторам размещенных материалов.
|