Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 130стр.doc
Скачиваний:
93
Добавлен:
15.06.2014
Размер:
2.49 Mб
Скачать

Создание dll

При разработке приложения функции, к которым обращается несколько процессов, желательно размещать в DLL. Это позволяет более рационально использовать память в Windows.

Проще всего создать новый проект DLL с помощью мастера AppWizard, который автоматически выполняет многие операции. Для простых DLL необходимо выбрать тип проекта Win32 Dynamic-Link Library. Новому проекту будут присвоены все необходимые параметры для создания библиотеки DLL. Файлы исходных текстов придется добавлять к проекту вручную.

Если же планируется в полной мере использовать функциональные возможности MFC, такие как документы и представления, или намерены создать сервер автоматизации OLE, лучше выбрать тип проекта MFC AppWizard (dll). В этом случае, помимо присвоения проекту параметров для подключения динамических библиотек, мастер проделает некоторую дополнительную работу. В проект будут добавлены необходимые ссылки на библиотеки MFC и файлы исходных текстов, содержащие описание и реализацию в библиотеке DLL объекта класса приложения, производного от CWinApp.

Иногда удобно сначала создать проект типа MFC AppWizard (dll) в качестве тестового приложения, а затем — библиотеку DLL в виде его составной части. В результате DLL в случае необходимости будет создаваться автоматически.

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

Рассмотрим сущность динамического и статического связывания (или компоновки)

Статическое связывание (static linking), когда для создания исполняемого exe-файла связываются воедино разные объектные obj-модули, lib-файлы библиотек и, как правило, скомпилированные res-файлы ресурсов.

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

В момент выполнения программы загружается вся библиотека целиком.

Хотя модуль динамически подключаемой библиотеки может иметь любое расширение (.exe или .fon) - приложение должно загрузить модуль библиотеки явно с помощью LoadLibrary или LoadLibraryEx , стандартным расширением, принятым в Windows, является .dll – эти Windows загрузит автоматически.

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

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

свойства DLL.

1.Один и тот же код DLL может использоваться разными процессами. Однако данные, с которыми работает DLL – для каждого процесса свои. Каждый процесс имеет собственное адресное пространство для всех данных, которые использует DLL.

2.Все, что делает динамически подключаемая библиотека, делается от имени приложения. 3.Несколько приложений могут использовать одну и ту же динамически подключаемую библиотеку.

Аспекты их создания.

Большинство библиотек DLL состоят из:

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

1.поставить в начале описания модификатор __declspec (dllexport)

2.определения модуля (.def),позволяющий лучше управлять процессом экспортирования

обычные функции, к-рые приложение не может вызвать

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

Разделяемая память в DLL

В Win32 библиотека DLL располагается в области памяти загружающего ее процесса. Каждому процессу предоставляется отдельная копия “глобальной” памяти. В Win32 динамическая библиотека, вернее, ее глобальные переменные, не могут использоваться процессами совместно. Можно создать общую область памяти для всех процессов, использующих данную библиотеку.

Ограничения DLL

Сам модуль динамически подключаемой библиотеки не имеет собственной очереди сообщений. Однако может вызывать функции GetMessage и PeekMessage. Сообщения, которые с помощью этих функций библиотека извлекает из очереди, фактически предназначена программе, вызывающей функции из библиотеки. Динамически подключаемая библиотека может загружать ресурсы либо из файла библиотеки, либо из файла программы, которая вызывает библиотеку. Функциям, которые загружают ресурсы, требуется дескриптор экземпляра модуля. Регистрация классов окна и создания окон в библиотеке может быть сложнее: для структуры класса окна, и для вызова функции CreateWindow требуется дескриптор экземпляра.

различные способы связывания приложения с библиотекой динамической компоновки.

Связывание с DLL при загрузке приложения (неявное подключение)

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

Динамическая загрузка DLL в процессе работы приложения

Можно связать программу с модулем библиотеки во время выполнения программы (при таком способе в процессе создания приложения не нужно использовать библиотеку импорта).

В DLL содержатся все функции Win32 API и несчетное количество других функций операционных систем Win32.

DLL — это просто наборы функций, собранные в библиотеки. Однако, в отличие от своих статических родственников (файлов . lib), библиотеки DLL не присоединены непосредственно к выполняемым файлам с помощью редактора связей. В выполняемый файл занесена только информация об их местонахождении. В момент выполнения программы загружается вся библиотека целиком. Благодаря этому разные процессы могут пользоваться совместно одними и теми же библиотеками, находящимися в памяти. Такой подход позволяет сократить объем памяти, необходимый для нескольких приложений, использующих много общих библиотек, а также контролировать размеры ЕХЕ-файлов. Чаще всего проект подключается к DLL статически, или неявно, на этапе компоновки. Загрузкой DLL при выполнении программы управляет операционная система. Однако, DLL можно загрузить и явно, или динамически, в ходе работы приложения.

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

.lib-файл, используемый при неявном подключении DLL, — это не обычная статическая библиотека. Такие .lib-файлы называются библиотеками импортирования (import libraries). В них содержится не сам код библиотеки, а только ссылки на все функции, экспортируемые из файла DLL, в котором все и хранится. В результате библиотеки импортирования, как правило, имеют меньший размер, чем DLL-файлы.

При разработке приложения функции, к которым обращается несколько процессов, желательно размещать в DLL. Это позволяет более рационально использовать память в Windows.

Проще всего создать новый проект DLL с помощью мастера AppWizard, который автоматически выполняет многие операции. Для простых DLL необходимо выбрать тип проекта Win32 Dynamic-Link Library. Новому проекту будут присвоены все необходимые параметры для создания библиотеки DLL. Файлы исходных текстов придется добавлять к проекту вручную.

Если же планируется в полной мере использовать функциональные возможности MFC, такие как документы и представления, или намерены создать сервер автоматизации OLE, лучше выбрать тип проекта MFC AppWizard (dll). В этом случае, помимо присвоения проекту параметров для подключения динамических библиотек, мастер проделает некоторую дополнительную работу. В проект будут добавлены необходимые ссылки на библиотеки MFC и файлы исходных текстов, содержащие описание и реализацию в библиотеке DLL объекта класса приложения, производного от CWinApp.

Иногда удобно сначала создать проект типа MFC AppWizard (dll) в качестве тестового приложения, а затем — библиотеку DLL в виде его составной части. В результате DLL в случае необходимости будет создаваться автоматически.

133