русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Динамическое связывание


Дата добавления: 2014-02-04; просмотров: 1639; Нарушение авторских прав


Статическое связывание

Вызов DLL

 

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

 

 

Для реализации первого способа, называемого статическим связыванием, создайте новое обычное приложение, поместите на форму три поля ввода LabeledEdit1…LabeledEdit3, кнопку и компонент Tlabel. После оператора IMPLEMENTATION добавьте строчку, обеспечивающую импорт функции GetArea из библиотеки geta.dll:

 

Function GetArea(a,b,c:real):REAL; FAR; EXTERNAL 'geta';

 

Слово EXTERNAL указывает на то, что тело данной функции находится в библиотеке с указанным именем, а слово FAR задает применение "длинных" четырехбайтных адресов, что необходимо, так как вызывающая программа находится на одной странице памяти, а DLL-библиотека – на другой. Разумеется, файл geta.dll надо поместить в ту же директорию, где находятся все файлы текущего приложения.

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

 

procedure TForm1.Button1Click(Sender: TObject);

 

VAR a,b,c:REAL;

 

begin

Label1.Caption:='';

TRY

a:=StrToFloat(LabeledEdit1.Text);

b:=StrToFloat(LabeledEdit2.Text);

c:=StrToFloat(LabeledEdit3.Text)

EXCEPT

Label1.Caption:='Ошибка ввода!';

Exit

END;

Label1.Caption:='S='+FloatToStrF(GetArea(a,b,c),ffFixed,10,4)

end;

 

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



 

 

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

 

procedure TForm1.Button1Click(Sender: TObject);

 

TYPE

TFunc = Function (a,b,c:real):REAL; STDCALL;

 

CONST DLLName='geta.DLL'; // имя DLL

 

VAR a,b,c:REAL;

Handle:THandle;

F:TFunc;

 

begin

Label1.Caption:='';

TRY

a:=StrToFloat(LabeledEdit1.Text);

b:=StrToFloat(LabeledEdit2.Text);

c:=StrToFloat(LabeledEdit3.Text)

EXCEPT

Label1.Caption:='Ошибка ввода!';

Exit

END;

Handle := LoadLibrary(DLLName); // загрузка библиотеки

IF ( Handle <> 0 ) THEN

BEGIN

// получение адреса функции GetArea в библиотеке

@F:=GetProcAddress(Handle,'GetArea');

IF Assigned(F) THEN

BEGIN

// вызов функции

Label1.Caption:='S='+FloatToStrF(F(a,b,c),ffFixed,10,4);

// выгрузка библиотеки из памяти

FreeLibrary(Handle)

END

END

ELSE

MessageDlg('Не найдена библиотека '+DLLName,mtWarning,[mbOK],0)

end;

 

Для динамического вызова, прежде всего, надо загрузить библиотеку при помощи функции LoadLibrary(имя_библиотеки). Эта функция возвращает ссылку на библиотеку, которую мы записываем в переменную типа Thandle. Теперь надо получить адрес функции GetArea, спрятанной в библиотеке. Его возвращает функция GetProcAddress(ссылка_на_библиотеку,имя_функции). А далее начинаются трюки. Для вызова функции из библиотеки надо описать особый тип данных – ссылку на функцию. В нем указывается, какие аргументы подаются на вход функции и значение какого типа она возвращает. Тип TFunc = Function (a,b,c:real):REAL; STDCALL; соответствует функции с любым именем, на вход которой надо подать три вещественных числа и которая возвращает одно вещественное число, используя стандартную модель вызова. Объявим переменную F типа TFunc. В нее и запишем адрес функции GetArea. Для этого используется символ @, означающий получение адреса переменной. Таким образом, в строке

 

@F:=GetProcAddress(Handle,'GetArea');

 

происходит следующее: переменная F размещается в памяти по тому же адресу, по которому в памяти расположен код функции GetArea. После этого переменная F превращается в ссылку на функцию, поэтому вполне законна запись F(a,b,c), означающая вызов функции GetArea с аргументами a,b,c. Наконец, команда FreeLibrary(ссылка_на_библиотеку) выгружает DLL из памяти.

В приведенном фрагменте предусмотрен ряд "затычек". Проверка условия Handle<>0 позволяет установить, удалось ли загрузить библиотеку (вдруг ее просто нет?) Условие Assigned(F) проверяет, удалось ли получить адрес функции в библиотеке.

Динамическое связывание позволяет подключаться к чужим DLL – достаточно знать, какие процедуры и функции в них находятся и с какими параметрами их надо вызывать.

 



<== предыдущая лекция | следующая лекция ==>
Создание DLL-библиотеки на Delphi | Отладка проектов с DLL


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.587 сек.