M Y D E L P H I 7 . R U Самоучитель программирования  
 
  • Главная
  •  

     

    Явный вызов

    Явный вызов динамической библиотеки подразумевает создание программистом соответствующего исходного кода. Ему необходимо предусмотреть загрузку 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.