русс | укр

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

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

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

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


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

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

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

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 – достаточно знать, какие процедуры и функции в них находятся и с какими параметрами их надо вызывать.

Просмотров: 722


Вернуться в оглавление



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


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

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

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


 


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

 
 

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