DLL и Дельфи

В комментарии указывается на необходимость вставить ссылку на модуль ShareMem, если библиотека экспортирует длинные строки в параметрах обращения к подпрограммам

DLL и Дельфи

Информация

Компьютеры, программирование

Другие материалы по предмету

Компьютеры, программирование

Сдать работу со 100% гаранией
ли правильная команда.

if (Operation<>"plus")and(Operation<>"minus")and(Operation<>"multiply")

and(Operation<>"div")and(Operation<>"mod") then

begin

ResultEdit.Text := "Введите корректную команду";

Exit;

end;

Result_ := MyFunc(Num1, Num2, Errcode, PChar(Operation)); //использование библиотечной функции

if Result_=Errcode then //если функция возвратила код ошибки то

begin //то сообщаем об этом.

ResultEdit.Text := "ОШИБКА";

EXIT;

end

else //а если результат отличный от кода ошибки

ResultEdit.Text := IntToStr(Result_);//то выводим его

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);

except

Num1Edit.Text := "0";

Num2Edit.Text := "0";

ResultEdit.Text := "Введите ЧИСЛA";

EXIT;

end;

Operation := OpEdit.Text; //также проверим, введена ли правильная команда.

if (Operation<>"plus")and(Operation<>"minus")and(Operation<>"multiply")

and(Operation<>"div")and(Operation<>"mod") then

begin

ResultEdit.Text := "Введите корректную команду";

Exit;

end;

//до этого момента код остался без изменений.

@MyFunc := nil; //очищаем адрес функции

LibHandle := LoadLibrary("Project2.dll");//пытаемся загрузить библиотеку

if LibHandle >= 32 then

begin //если все прошло успешно то

@MyFunc := GetProcAddress(LibHandle, "MathFunc");//пытаемся найти адрес функции

if @MyFunc <> nil then //если адрес найден (функция существует в библиотеке)

Result_ := MyFunc(Num1, Num2, Errcode, PChar(Operation)); //использование библиотечной функции

if Result_=Errcode then //если функция возвратила код ошибки то

begin //то сообщаем об этом.

ResultEdit.Text := "ОШИБКА";

EXIT;

end

else //а если результат отличный от кода ошибки

ResultEdit.Text := IntToStr(Result_);//то выводим его}

end;

end;

Заключение

В этой статье мы коснулись лишь основных аспектов программирования с применением динамически-подключаемых библиотек. А ведь в DLL можно хранить всякие картинки и даже формы! С помощью них удобно создавать всякие плагины. Но это уже совсем другая история

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://www.soch.imperium.by

 

Похожие работы

< 1 2