Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vstup.docx
Скачиваний:
46
Добавлен:
28.09.2019
Размер:
6.42 Mб
Скачать

4.8 Ініціалізація dll-бібліотек, динамічний експорт та імпорт функцій у середовищі Microsoft Windows. Бібліотеки динамічної компоновки. Ініціалізація dll.

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

2.23.1. Статическая и динамическая компоновка

Рассмотрим процесс создания программ для MS-DOS. После трансляции исходных моделей компилятором получались объектные модули. После этого в дело включался редактор связей, который компоновал объектные модули и модули из библиотек объектных модулей в один exe-файл. Таким образом, редактор связей записывал в файл программы все модули, необходимые для работы. Если же программа была сложной и не помещалась целиком в 640 Кбайт оперативной памяти, на помощь приходили оверлеи, позволяющие загружать в оперативную память только те сегменты программы, которые требовались для решения текущей задачи.

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

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

DLL-библиотеки имеют расширение имени dll. Но могут они иметь и расширение exe. Файлы krnl286.exe, krnl386.exe, gdi.exe и user.exe, составляющие ядро Windows, есть не что иное, как DLL-библиотеки.

DLL-библиотеки в Windows

Формат DLL-библиотек почти идентичен формату загрузочного файла приложения Windows, однако “запустить” DLL-библиотеку на выполнение нельзя. Для того, чтобы понять отличия между приложением и DLL-библиотекой, рассмотрим такие понятия, как задача (task), копия приложения (instance) и модуль (module).

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

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

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

Модуль приложения состоит из исполняемого кода и ресурсов. Внутри Windows есть база данных модулей, в которой хранится такая информация, как ссылки на экспортируемые функции, расположение сегментов кода и сегментов, содержащих ресурсы. Так как модуль приложения не изменяется, все запущенные копии одного приложения могут им пользоваться.

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

DLL-библиотеки, в отличие от приложения, не имеют стека и очереди сообщений.

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

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

Отметим достоинства DLL-библиотек.

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

С помощью DLL-библиотек можно организовать коллективное использование ресурсов или данных, расположенных в сегменте данных библиотеки. Более того, можно создать DLL-библиотеку, состоящую только из одних ресурсов, например, из пиктограмм или изображений bitmap.

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

У динамической компоновки есть и свои недостатки.

Во-первых, DLL-библиотеки сложнее в разработке по сравнению с обычными библиотеками статической компоновки.

Во-вторых, в дополнение к exe-файлу вместе с приложением необходимо устанавливать один или несколько dll-файлов, что усложняет процесс установки и сопровождения приложения. Может также возникнуть ситуация, когда приложение не находит своюDLL-библиотеку, несмотря на то, что нужная библиотека есть на диске.

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

Обычно библиотека DLL имеет код инициализации (например, выделение памяти), который должен выполняться при загрузке библиотеки DLL. При использовании Visual C++ место добавления кода для инициализации библиотеки DLL зависит от типа библиотеки DLL, построение которой выполняется. При отсутствии необходимости добавления кода инициализации или завершения при построении библиотеки DLL не требуется никаких дополнительных действий. Чтобы определить место добавления кода при инициализации библиотеки DLL, см. нижеследующую таблицу.

Тип библиотеки DLL

Место добавления кода инициализации и завершения

Обычная библиотека DLL

В код InitInstance и ExitInstance объекта CWinApp библиотеки DLL.

Библиотека DLL расширения

В функцию DllMain, созданную с помощью мастера MFC DLL.

Библиотека DLL (не MFC)

В предоставляемую пользователем функцию с именем DllMain.

В Win32 все библиотеки DLL могут содержать дополнительную функцию точки входа (называемую обычно DllMain), которая вызывается для инициализации и завершения. Это позволяет при необходимости выделить или освободить дополнительные ресурсы. Функция точки входа вызывается Windows в четырех случаях: присоединение процесса, отсоединение процесса, присоединение потока и отсоединение потока.

Библиотека времени выполнения языка C предоставляет функцию точки входа с именем _DllMainCRTStartup и вызывает функцию DllMain. В зависимости от типа библиотеки DLL пользователю необходимо иметь функцию с именем DllMain в исходном коде или использовать функцию DllMain, предоставленную в библиотеке MFC.

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