Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ТП!!.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
458.75 Кб
Скачать

14. Библиотека динамической компоновки. Области применения. Разработка и использование dll-библиотек.

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

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

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

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

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

Цель создания DLL это экономия памяти и возможность коллективного использования ресурсов.

Недостатки DLL:

1.Относительная сложность разработки.

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

3.Требуется планирование типа и состава функций, входящих в DLL библиотеку, иначе не будет экономии памяти.

Структура DLL библиотеки.

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

В качестве параметров LiBEntry использует следующие регистры:

  1. DS - селектор, указывающий на сегмент данных DLL библиотеки.

  2. DI – идентификатор DLL библиотеки, который присваивается ей ОС после загрузки в ОП.

  3. CX – содержит требуемый размер локальной области данных.

  4. ES:SI – регистровая пара – дальний указатель на строку параметров, которая задается явной при загрузке DLL библиотеки.

Кроме функции LibEntry нужно наличие двух интерфейсных функций – LiBMain и WEP (Windows Exit Procedure). Данные функции разрабатываются программистом и содержат следующее описание:

LiBMain

(hInstance идентификатор

DataSegment селектор, соответствующий сегменту данных

HeapSize размер в байтах локальной области данных

CmdLine указатель на командную строку)

Если вызов функции происходит успешно, то LibMain возвратит ненулевое значение. Функция LiBMain вызывается только один раз при первом обращении к функциям библиотеки. При запуске нового приложения или копии данного приложения, использующего любую функцию библиотеки, происходит увеличение счетчика обращений к библиотеке. Для этого в локальной области данных DLL создаётся специальная структура, хранящая идентификатор приложения и число активных обращений. DLL библиотека в любой момент может быть выгружена из памяти. Перед выгрузкой из ОП ОС вызывает функцию WEP, которая используется для освобождения структурных данных, запрошенных в функциях библиотеки, включая функцию LiBMain.

Функция WEP. Возможны два значения параметра:

* WEP_FREE_DLL – функциями библиотеки не пользуется ни одно из приложений, либо какое-то приложение выработало запрос на выгрузку библиотеки.

* WEP_SYSTEM_EXIT – выгрузка библиотеки происходит из-за завершения работы ОС.

Функция WEP всегда должна возвращать единичное значение.

Экспортированные функции DLL библиотеки.

Это функции, доступные для приложений. Описать ЭФ можно двумя способами:

  1. Указать ключевое слово _export в заголовке функции.

  2. Указать ЭФ в файле определения модуля при помощи операции EXPORTS Имя функ. @ Номер функ.

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

Функция DLL библиотеки может вызываться как по имени, так и по номеру (быстрее). В последнем случае нужно, чтобы номер функции оставался постоянным.

Импортированные функции.

При статической компоновке в файл проекта включается LiBфайл, содержащий нужную библиотеку объектных модулей. При динамической компоновке в exe файл записывается ссылка на DLL библиотеку и функцию в ней. При компоновке редактор связи определяет имя библиотеки и имя функции (или порядок). Данная задача может решаться двумя способами:

1.Способ неявной компоновки.

Для создания связей должен иметься доступ к библиотеке импорта. Библиотека импорта создается на основе DLL библиотеки средствами среды программирования и оформляется в виде LiB файла.

2.Использование в файле определение модуля приложения оператора IMPORTS

Данный оператор определяет импортируемые приложения функции. Определение ссылок на импортируемые функции выполняется следующим образом:

Имя функ. При вызове=имя библ. . №функ. Или имя библ. . имя функ. В библ.

Например:

IMPORTS

1)MSG=dll.4

2)dll.msg

3.Динамический импорт функции во время выполнения приложения. Приложение может загрузить библиотеку в любой момент времени с помощью функции LOADLIBRARY. Параметр есть указатель на текстовую строку, содержащую путь к файлу или имя файла. Если указывается только имя файла, то файл должен находиться либо в текущем каталоге, либо в каталоге Windows.

Функция LOADLIBRARY возвращает код идентификатора библиотеки, может быть вызвана несколькими приложениями, но загрузку производит только один раз. После завершения работы она должна быть выгружена. Выгрузка библиотеки осуществляется с помощью функции FreeLibrary, где в качестве параметра передается идентификатор библиотеки, полученный при вызове функции LOADLIBRARY.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]