На главную страницу
Форум txt.version   




Статья :: Явный вызов

 

Явный вызов

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

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

Листинг 28.6. Модуль главной формы проекта DemoDll2

unit Unit2;

 interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

StandardProc = function(AText: String): Boolean;

TMainForm = class(TForm)

Editl: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

LabelS: TLabel;

procedure FormShow(Sender: TObject);

procedure EditlExit(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Edit2Exit(Sender: TObject);

procedure EditSExit(Sender: TObject);

 private

DLLHandle: THandle;

LoadError: Word;

IsValidlnt: StandardProc;

IsValidDate: StandardProc;

ValidTime: StandardProc;

 public

{ Public declarations }

  end;

var

MainForm: TMainForm;

implementation {$R *.DFM}

procedure TMainForm.FormShow(Sender: TObject);

 begin

DLLHandle := LoadLibrary('DataCheck');

 if DLLHandle = 0 then begin if GetLastError = ERROR_DLL_NOT_FOUND

then ShowMessagef'Ошибка загрузки DLL'); 

Close;

  end;

@IsValidInt := GetProcAddress(DLLHandle, 'IsValidlnt');

 SIsValidDate := GetProcAddress(DLLHandle, 'IsValidDate');

 SValidTime := GetProcAddress(DLLHandle, 'ValidTime');

  end;

procedure TMainForm.FormClose(Sender: TObject;

 var Action: TCloseAction);

 begin if DLLHandle <> 0

then FreeLibrary(DLLHandle);

  end;

procedure TMainForm.EditlExit(Sender: TObject); 

begin

if not IsValidlnt(Editl.Text)

then Edit2.Clear; 

end;

procedure TMainForm.Edit2Exit(Sender: TObject);

 begin if not IsValidDate(Edit2.Text)

then Editl.Clear; 

end;

procedure TMainForm.EditSExit(Sender: TObject);

 begin 

if not ValidTime(Edit3.Text)

then Edit3.Clear;

  end;

end.

Загрузка динамической библиотеки DataCheck осуществляется в методе-обработчике FormShow при помощи функции LoadLibrary. Имя динамической библиотеки может не содержать маршрута, если файл DLL расположен в одном каталоге с программой. Если в этом каталоге файл DLL не найден, поиск последовательно проводится в текущем каталоге, \SYSTEM и каталогах из перечня Path.

Так как для этой системной функции не создается исключительная ситуация, то следом предусмотрен контроль возможных ошибок. Функция GetLastError возвращает код последней ошибки.

Примечание

Код ошибки ERROR_DLL_NOT_FOUND, Наряду со многими другими кодами, содержится в файле Windows.PAS.

Если библиотека успешно загружена, в три процедурные переменные типа standardProc передаются адреса соответствующих функций DLL. Процедурный тип standardProc объявлен перед классом формы. Для этого используется системная функция GetProcAddress.

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

При закрытии приложения необходимо выгрузить все используемые динамические библиотеки Припомощи системной функции FreeLibrary.

 

Явный вызов

страницы в данном разделе 
 ГЛАВА 28  ГЛАВА 28 Динамические библиотеки
 Проект DLL  Экспорт из DLL
 Соглашения о вызовах  Директива register
 Директива pascal  Директива stdcall
 Директива cdecl  Директива safecall
 Инициализация и завершение работы DLL  Вызов DLL
 Неявный вызов  Явный вызов
 Ресурсы в DLL  Использование модуля ShareMem
 Резюме   


Разделы
Околокомпьютерная литература (375)
Программирование (102)
Программы (75)
ОС и Сети (49)
Интернет (29)
Аппаратное обеспечение (16)
Базы данных (6)

Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)

PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C





 
©  programming-lang.com  справочник программиста