Реферат: DLL и Дельфи

end;

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

2. Динамическая загрузка

Недостатки:

- громоздкость и сложность кода

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

Преимущества:

- начисто лишен всех недостатков первого способа + некоторые другие преимущества перед первым способом

Этот способ довольно сложен, особенно для новичков. Но преимуществ перед первым способом у него куда больше. Для работы с динамически загружаемыми библиотеками просто необходимо знать три WinAPI функции: LoadLibrary, GetProcAddress И FreeLibrary.

LoadLibrary(LibFileName: PChar) - загружает библиотеку LibFileName в память. Если библиотека загружена удачно, то функция возвращает дескриптор (THandle) DLL в памяти.

GetProcAddress(Module: THandle; ProcName: PChar) - находит точку входа в функцию ProcName. Внимание! Здесь нужно указать NAME функции, а не её название. Если функция найдена, то функция GetProcAddress возвращает дескриптор (TFarProc) функции в загруженной DLL.

FreeLibrary(LibModule: THandle) - выгружает библиотеку LibModule. При этом вся занятая этой библиотекой память освобождается. Следует заметить, что после вызова этой процедуры функции данной библиотеки больше недоступны и обращение к ним вызовет исключение.

Для того, что бы динамически загрузить функцию из библиотеки, то необходимо её обьявить в разделе var:

MyFunc: function(num1, num2, Errcode : Integer; Operation : PChar) : Integer; stdcall;

Также нужно обьявить переменную типа THandle. "На пальцах" не обьяснишь, поэтому давайте рассмотрим пример динамической загрузки DLL на основе нашей демонстрационной библиотеки.

Откройте предыдущий проект с демонстрацией статическо загрузки. В разделе var обьявите пару новых переменных:

LibHandle: THandle;

MyFunc: function(num1, num2, Errcode : Integer; Operation : PChar) : Integer; stdcall;

Обработчик кнопки приведите к такому виду:

procedure TForm1.DoItButtonClick(Sender: TObject);

const

Errcode : Integer=978987;//код ошибки - может быть абсолютно любым.

var

Num1, Num2, Result_ : Integer;//для проверки чисел

Operation : String;//операция, для передачи параметра функции

begin

try //прежде чем передать числа

Num1 := StrToInt(Num1Edit.Text); //функции проверим их

Num2 := StrToInt(Num2Edit.Text);

К-во Просмотров: 468
Бесплатно скачать Реферат: DLL и Дельфи