Явный вызов
Явный вызов динамической библиотеки подразумевает создание программистом соответствующего исходного кода. Ему необходимо предусмотреть загрузку 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) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: 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.