Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab15_Библиотеки.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
238.08 Кб
Скачать

Лабораторная работа №15 Библиотеки

Цель работы: изучить правила оформления и использования динамических библиотек; научится осуществлять статическое и динамическое связывание библиотек.

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

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

Применение динамических библиотек позволяет добиться ряда преимуществ:

 Уменьшается размер исполняемого файла приложения и занимаемые им ресурсы

 Функции DLL могут использовать несколько процессов одновременно

 Управление DLL возлагается на операционную систему

 Внесение изменений в DLL не требует перекомпиляции всего объекта

 Одну DLL могут использовать программы, написанные на разных языках

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

Создание библиотеки

Создадим библиотеку, содержащую полезную функцию, выводящую на окне вызывающего клиента растровое изображение. Для этого в среде Delphi в главном меню выберите пункт File | New и в появившемся окне New Items щёлкните на значке с надписью ‘DLL’.

Ч тобы выводимый растр не оказался легко доступным для посторонних глаз, скроем его, поместив в библиотеку. Для этого откройте редактор ресурсов Image Editor (меню Tools). В нем выберете пункт меню File | New | Resource File. В появившемся окошке (Untitled1.res – позже его необходимо будет сохранить под именем DLLRes.res) щелкните правой кнопкой мышки на Contens и выберите New | Bitmap. В появившемся окошке Bitmap Properties будет стоять размер растра по умолчанию – 32×32, пока нажмите OK. Переименуйте Bitmap1 в Bmp1. Выберите в Image Editor File | Open и откройте любую картинку из каталога C:\Program Files\Common Files\Borland Shared\Images\Splash\16Color. Щелкните правой кнопкой мыши на область, свободной от рисунка, и выберите пункт Properties. В данном пункте посмотрите ширину и высоту растра. Закройте данное окно. Теперь откройте BMP1 и, выбрав пункт Properties аналогично описанному ранее способу, проставьте новые размеры. Скопируйте растр из выбранного вами файла в BMP1. Теперь сохраните созданный Вами ресурс (res-файл) под именем DLLRes.res и запишите его в каталог, предназначающийся для проекта библиотеки.

Код DLL-проекта приведите к следующему виду:

library Project1;

uses Windows, Graphics;

{$R DLLRes.res} //Подключение файла ресурсов

//Описание экспортируемой функции, размещаемой в DLL (export)

procedure DrawBMP (Handle : THandle); export; stdcall;

var Bitmap1 : TBitmap;

Canvas1 : TCanvas;

begin

//Создаем Bitmap с именем Bitmap класса TBitmap

Bitmap1 := TBitmap.Create;

// Создаем Canvas с именем Canvas класса TCanvas

Canvas1 := TCanvas.Create;

try

//Растр загружается из ресурсов, идентифицируется именем BMP1

Bitmap1.LoadFromResourceName (HInstance, 'BMP1');

//HInstance снабжает описатель экземпляра или библиотеки для //применения

Canvas1.Handle := Handle;

Canvas1.Draw(0, 0, Bitmap1); //Помещаем растр на канву

finally

Canvas1.Free;

//Освобождаем память, зарезервированную под Canvas1

Bitmap1.Free;

//Освобождаем память, зарезервированную под Bitmap1

end;

end;

exports //Список экспортируемых функций

DrawBMP; //Функция у нас единственная – DrawBMP

begin //Блок, соответствующий инициализации библиотеки

end.

В создаваемую библиотеку необходимо подгрузить модули Windows и Graphics. Они необходимы для использования графики в Delphi при помощи Windows-функций.

Аргументом процедуры DrawBMP должен являться идентификатор (Handle) канвы вызываемой формы. У вспомогательного объекта Canvas1 этой процедуры значение Handle устанавливается в значение аргумента процедуры DrawBMP, т.е. Handle, и теперь все его методы будут работать на канве окна, вызывающего функцию приложения.

Создайте DLL, откомпилировав проект (Compile Project Ctrl-F9). Созданная нами библиотека содержит код экспортируемой функции с именем DrawBMP и растровое изображение. Сервер готов.

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