Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
laboratornye_Delphi.doc
Скачиваний:
16
Добавлен:
17.05.2015
Размер:
2.78 Mб
Скачать

Пример 20. 2. Создать библиотеку содержащую функции сложения целых и вещественных чисел, а также строк. Код библиотеки имеет вид

library MyDll;

//Только при передаче строк не забудьте включить в этот раздел

// модуль ShareMem

uses

ShareMem,

SysUtils,

Classes;

{$R *.res}

//Глобальная для DLL переменная

var GlbVar:real; //приведена в качестве примера и не используется

//Библиотека включает три экспортируемые функции и

// одну внутреннюю функцию

//Сложение целых чисел

function AddInt(a,b:integer):integer;

begin

Result:=a+b;

end;

//Сложение действительных чисел

function AddReals(c,d:real):real;

begin

Result:=c+d;

end;

//Сложение строк чисел

function AddStr(e,f:string):string;

begin

Result:=e+f;

end;

//внутренняя (неэкспортируемая) функция

//приведена в качестве примера и не используется

function intfunc():integer;

begin

Result:=1;

end;

//экспортирование функций

exports

AddInt,

AddReals,

//для функции сложения строк задается внешнее имя

AddStr name 'AddStrfromDll';

begin

end.

Статический вызов библиотеки

Под вызовом библиотеки понимается использование заложенных в нее кода и ресурсов.

При вызове библиотеки программист не имеет возможности указывать ее раз­мещение, поэтому библиотека должна быть расположена в каталоге, в котором она будет найдена Windows автоматически. Такими каталогами являются, на­пример, корневой каталог Windows, его подкаталоги SYSTEM и SYSTEM32, а также каталог, из которого запущено приложение. Если при выполнении при­ложения необходимая библиотека не найдена, то выдается соответствующее со­общение (рис. 20.4).

Рис. 20.4. Сообщение об ошибке, если библиотека не найдена

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

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

Заголовок функции> external <Имя библиотеки>;

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

После объявления функции как внешней ее можно использовать как обычную внутреннюю функцию модуля.

Пример 20.3. Используем статически функции, описанные в библиотеке (см. Пример 20.2). Экранная форма программы показана на рис. 20.5. Фрагмент кода с использованием функций из библиотеки:

Implementation

{$R *.dfm}

//объявление функций как внешних (импортируемых).

// В качестве имен функций указываются их внешние имена

// из раздела exports библиотеки.

// Для имени файла библиотеки не забудьте указать расширение dll

function AddInt(a,b:integer):integer; external 'MyDll.dll';

function AddReals(c,d:real):real; external 'MyDll.dll';

function AddStrfromDll(e,f:string):string; external 'MyDll.dll';

procedure TUntUseDllMain.BtnAddIntClick(Sender: TObject);

var N1,N2,Res:integer;

begin

N1:=strtoint(EdtInt1.Text);

N2:=strtoint(EdtInt2.Text);

Res:=AddInt(N1,N2);

EdtResInt.Text:=inttostr(Res);

end;

procedure TUntUseDllMain.BtnAddRealClick(Sender: TObject);

var N1,N2,Res:real;

begin

N1:=strtoFloat(EdtReal1.Text);

N2:=strtoFloat(EdtReal2.Text);

Res:=AddReals(N1,N2);

EdtResReal.Text:=Floattostr(Res);

end;

procedure TUntUseDllMain.BtnAddStrClick(Sender: TObject);

var N1,N2,Res:string;

begin

N1:=EdtStr1.Text;

N2:=EdtStr2.Text;

Res:=AddStrfromDll(N1,N2);

EdtResStr.Text:=Res;

end;

end.

Рис. 20.5. Экранная форма примера 20.3

Рис. 20.6. Экранная форма для лабораторной работы № 20

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