Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы IT / ЛабаDelphi12.doc
Скачиваний:
62
Добавлен:
06.02.2015
Размер:
336.9 Кб
Скачать

Лабораторная работа №12. Работа в DELPHI.

Библиотеки.

В современном программировании понятие «библиотека» играет громадную роль. Большинство серьезных программ создаётся с их использованием. В операционной системе Windowsбиблиотеки применяются очень широко.

В математическом словаре даётся следующее определение библиотеки в информатике: библиотека – это организованная совокупность программ или вспомогательных алгоритмов. Обычно Библиотека алгоритмов или программ хранится во внешней памяти ЭВМ, в рамках той или иной файловой системы, обеспечивающей автоматизированный доступ к отдельным алгоритмам и программам.

Таким образом, библиотека представляет из себя – конкретный исполняемый файл (расширение .DLL) с откомпилированным кодом (машинный код который исполняет процессор) содержащий процедуры, функциии ресурсы (например, рисунки и т.д.).

Может возникнуть справедливый вопрос: зачем нужны библиотеки, если все функции и процедуры можно хранить в модуле?

Ответ можно дать на примере. Пусть у вас два разных проекта. Каждый из них использует некоторые одинаковые процедуры и функции. И если вы одновременно загрузите исполняемые exe–файлы этих двух проектов, в память ЭВМ будут дважды загружены одни и те же процедуры и функции. Таким образом, оперативная память будет использоваться неэкономично. К тому же и на жестком диске будут два разных модуля имеющие внутри себя одинаковые процедуры и функции. Потому и память жесткого диска будет неэффективно тратиться.

А если загружено 5, 6 или более подобных проектов, то затраты памяти могут быть существенными.

На помощь приходит библиотека DLL–DynamicLinkLibrary. Она, как правило, один раз загружается в оперативную память и все процедуры и функции, которые она содержит в единственном экземпляре, могут использоваться несколькими различными приложениями. Таким образом, одну и ту же функцию, без её тиражирования в памяти, могут использовать 2, 3, 4 и сколько угодно приложений. Это снимает проблему с расходами на оперативную память. То же самое и с жестким диском, так как все процедуры и функции хранятся в одном файле библиотеки, а не дублируются в модулях.

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

1. Создание библиотеки с использованием Dll Wizard

Задание 1.1. Создадим библиотеку в виде файла MainDll.dll, опишем в ней 3 функции: суммы двух чисел, произведения двух чисел а также функцию возвращающую строку направлением задом–наперёд.

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

Зайдите в File–>New–>Otherи дважды щелкните по значку с надписьюDll Wizard(Рис. 1).

Рис. 1Выберите мастера создания библиотекDLLWizard

Перед вами в окне редактора кода появится заготовка файла–библиотечного проекта (рис. 2):

Рис. 2 Заготовка библиотечного проекта

Сохранитесь в конкретной папке проекта, заменив имя файла проекта cProject2.dprнаMainDll.dpr. Таким образом, у вас появится такое же окно библиотечного проекта, как и ранее только после ключевого словаlibraryи в заголовке окна будет написаноMainDll.

Комментарии здесь говорят о том, что если процедуры или функции, которые будут экспортироваться во внешние приложения, будут получать или возвращать переменные строкового типа String, то в самом библиотечном файле–проекте, а также в файле проекта приложения, которое будет использовать данную библиотеку, требуется первым подключать модуль ShareMem.

Одна из наших функций будет работать со строками типа String, поэтому в секцииusesпервым из подключаемых модулей напишитеShareMem.

Удалите комментарии, так как в данном случае они лишние не нужны.

По умолчанию подключено два модуля SysUtils и Classes.

SysUtils– модуль, в котором обрабатываются исключения. Исключение или исключительная ситуация это необычная или неожиданная ситуация (ошибка), прерывающая нормальное выполнение программы. Например, деление на ноль. Если этот модуль будет отключен, то исключение вызовет аварийную остановку программы и выгрузит задачу из памяти. Если он присутствует, то данное исключение будет передано для обработки в вызывающую программу для дальнейшей обработки. Желательно чтобы он присутствовал.

После секции usesначинается блокbeginend.

Всё что находится внутри этого блока, будет выполнено в первую очередь и только один раз, при загрузки библиотеки в оперативную память. Если этого делать не требуется, то можно ничего не писать внутри блока или можно просто удалить одно слово begin, оставивend.

Теперь будем непосредственно описывать функции библиотеки.

Функции и процедуры библиотеки описываются между директивой {$R *.res} и ключевым словом exports.

Строчкой ниже директивы {$R *.res} напишите следующее:

function SummaX_Y(X,Y:real):real; stdcall; //функция суммы двух чисел X и Y

begin

result:=X+Y;

end;

Далее ниже ещё напишите:

function ProizvX_Y(X,Y:real):real; stdcall; //функция произведения двух чисел X и Y

begin

result:=X*Y;

end;

А также напишите снова:

function Revers(S:string):string; stdcall;//функция возвращающая строку S задом–наперёд

var i,L:byte; S_:string;

begin

L:=length(S);//length(s:string)–стандартная функция возвращающая длину строкиs

S_:='';

for i:=1 to L do S_:=S_+S[L-i+1];

result:=S_;

end;

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

Ключевое словоexports находится сразу после всех описанных процедур и функций или перед началом блока begin end.

Ключевое слово stdcallжелательно указывать всегда. Оно определяет стандарт передачи параметров функции справа – налево. Данный стандарт принят многими языками программирования.

Сразу после описания последней функции Reversи перед блокомbeginendукажем, какие функции будут доступны (экспортироваться) внешнему приложению.

Напишите там следующее (рис. 3):

exports

SummaX_Y,

ProizvX_Y,

Revers;

Таким образом, приложению будут доступны функции : SummaX_Y, ProizvX_Y и

Reversкоторые оно будет использовать.

Рис. 3Имена экспортируемых библиотекой функций

записываем после ключевого слова exports

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

Осталось последнее. Требуется, чтобы набранный вами код скомпилировался в исполняемый файл библиотеки с расширением *.dll. Это очень легко сделать, простонажмите Ctrl+F9.

Вот и всё. Библиотека готова. Посмотрите в папку вашего проекта, и вы обнаружите там файл MainDll.dll.

Теперь закройте данный проект File–>CloseAll, так как библиотека создана.

Задание 1.2. Создадим внешнее приложение Project1.exe которое использовало бы функции созданной библиотеки MainDll.dll.

Создайте новый проект и сохранитесь (имя проекта по умолчанию project1.dpr, имя модуля тожеunit1.pas) в той же папке где и файл созданной библиотеки MainDll.dll.

Первое что нужно сделать, так это подключить библиотеку к вашему проекту. Поэтому в окне редактора кода, в модуле, сразу после директивы {$R *.dfm} нужно прописать все функции и процедуры экспортируемые из библиотеки. Причем нужно прописывать функции и процедуры полностью, указывая их параметры и тип возвращаемого значения, как и при создании библиотеки.

Строчкой ниже директивы {$R *.dfm}, в окне редактора кода напишите следующее:

function SummaX_Y(X,Y:real):real; stdcall; external 'MainDll.dll';

function ProizvX_Y(X,Y:real):real; stdcall; external 'MainDll.dll';

function Revers(S:string):string; stdcall; external 'MainDll.dll';

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

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

Так как ваше приложение использует функции библиотеки для передачи строковых переменных, то в головном файле приложения *.dprвы должны первым написать модульShareMem. Сделайте это. Должно быть так как на рисунке:

Рис. 4Добавляем модульShareMemдля передачи строковых параметров

Далее скиньте на форму Button1,RichEdit1, а также 3 компонентаlabel, 3 компонентаEdit. Разместите их следующим образом (рис. 5):

Рис. 5Приложение использующее библиотеку MainDll.dll

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

procedure TForm1.Button1Click(Sender: TObject);

var X,Y:real; S:string;

begin

RichEdit1.Clear;

X:=StrToFloat(Edit1.Text);//определяем X

Y:=StrToFloat(Edit2.Text); //определяем Y

S:=Edit3.Text; //определяем строку S

ShowMessage('БиблиотекаMainDll.dllзагружена, можете использовать'+#10#13+

’нужные вам библиотечные функции’);

MessageBeep(1000);

//Вызываем библиотечную функцию SummaX_Yи результат выводим вRichEdit1

RichEdit1.Lines.Add(‘Сумма X и Y равна ’+ FloatToStr(SummaX_Y(X,Y) ) );

RichEdit1.Lines.Add('');

//Вызываем библиотечную функцию ProizvX_Yи результат выводим вRichEdit1

RichEdit1.Lines.Add(‘ПроизведениеXиYравно ’+FloatToStr(ProizvX_Y(X,Y) ) );

RichEdit1.Lines.Add('');

//Вызываем библиотечную функцию Reversи результат выводим вRichEdit1

RichEdit1.Lines.Add(‘Строка перевернута – > ’+Revers(S)) ;

end;

Запустите программу. Введите значения для XиY, а также строку в соответствующие поля и щелкните поButton1. Программа должна работать правильно и библиотечные функции должны сработать верно выдав результат в компонентRichedit1.

Вернитесь в Режим Программирования (РП).

Не удаляйте папку с данным проектом он понадобится в дальнейшем.

Таким образом, мы научились создавать библиотеку, а затем подключать её из внешнего приложения. Вообще то в данном контексте смысл понятия ‘внешнее приложение’ не вполне уместен, так как библиотека и предназначена для внешних приложений её использующих, но чтобы подчеркнуть сам факт внешности приложения по отношению к библиотеке автор и дальше будет его использовать это понятие. Это делается в учебных целях.

Соседние файлы в папке Лабы IT