Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ ОС ЭКЗАМЕН.docx.doc
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
185.86 Кб
Скачать

3. Библиотека. Динамическая библиотека. Создание.

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

Динамическая библиотека - (Dynamic Link Library - DLL), файлы с расширением DLL, загружаемый при запуске модуля, который использует библиотеку, или во время его выполнения. Все функции динамических библиотек делятся на два класса: экспортируемые ( могут использоваться другими программами DLL ), Внутренние ( не могут использоваться ).

Достоинства:

- библиотеки не зависят от среды, в котором они созданы. Так библиотека, созданная в среде С + + Builder, можно использовать в среде Visual Studio и наоборот;

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

- если несколько приложений используют одну и ту же библиотеку, копия этой библиотеки хранится в памяти только один раз.

Недостатки:

- Кроме программы, которая выполняется необходимо иметь дополнительный модуль - саму библиотеку.

- Функции DLL использовать сложнее, чем функции статической библиотеки.

- Остальные преимуществ и недостатков DLL зависят от режимов использования библиотеки этого типа.

Недостатки статического режима использования .dll:

- .lib файл является платформенно -зависимым.

- .dll не всегда содержит .lib файл, например ресурсная DLL.

- dll находится в памяти все время выполнения программы.

Создание:

Для создания DLL в среде используется проект типа DLL (File → New → Projects → Win32. После задания имени проекта выбирается тип DLL и, пока, выбираем пустую DLL (An empty DLL project). Добавим к проекту необходимые файлы по определению функций. Добавим файл с заголовками экспортируемых функций. Эти функции должны в заголовке иметь __declspec (dllexport).

Трансляция и компоновка DLL выполняется как и для проектов других типов.

В результате выполнения будут созданы один или 2 файла: файл *. dll и *. lib, если есть хоть одна экспортируемая функция. Имена файле по умолчанию совпадают с именем проекта. Эти имена можно заменить. Файл *. lib содержит справочник функций, а именно имя соответствующей DLL и таблицу функций. Для каждой функции задается ее имя, номер и адрес относительно начала DLL. Ранее номер использовался для вызова соответствующей функции, сегодня для вызова функций используется только ее имя.

4. Библиотека. Динамическая библиотека. Статическая загрузка.

Существует два основных способа подключить DLL к программе - динамический и статический.

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

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

Во-первых, можно непосредственно добавить файл MyDll.lib в проект посредством команды Project->Add to project->Files... Во-вторых, можно указать имя библиотеки импорта в опциях линкера. Для этого откройте окно настроек проекта (Project->Settings...) и добавьте в поле Object/Library modules на вкладке Link имя MyDll.lib. Наконец, можно встроить ссылку на библиотеку импорта прямо в исходный код программы. Для этого используется директива #pragma c ключем comment( lib, “имя библиотеки.lib” ).

Достоинства:

1. Если нет необходимой DLL, программа не будет загружена.

2. Использование по сложности одинаково с использованием статических библиотек.

Недостатки:

1. Файл с расширением lib является платформенно зависимым, то есть Visual Studio, C + + Builder используют различные файлы.

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

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