Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Динамическая и статическая загрузка DLL

DLL возможно загружать двумя способами:

  1. статически
  2. динамически

Давайте создадим простую библиотеку DLL:


{Project file name: c:\example\exdouble\exdouble.dpr}

library ExDouble;
// my simple dll

function calc_double(r: real): real; stdcall;
begin
  result := r * 2;
end;

exports
  calc_double index 1;

end;

Теперь посмотрим, как её можно загружать:

Статическая загрузка DLL

При таком способе загрузки достаточно поместить файл DLL в директорию приложения или в директорию Windows, или в Windows\System, Windows\Command. Однако, если система не найдёт этого файла в этих директория, то высветится сообщение об ошибке (DLL не найдена, или что-то в этом духе).


unit untMain;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;

implementation

function calc_double(r: real): real; stdcall; external 'ExDouble.dll';

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // в окошке сообщения будет цифра 21
  ShowMessage(FloatToStr(calc_double(10.5)));
end; 

end.

Динамическая загрузка DLL

При динамической загрузке требуется написать немного больше кода.

А вот как это выглядит:


unit untMain;

interface

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

type
  Tcalc_double = function ( r: real ): real;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  hndDLLHandle: THandle;
  calc_double: Tcalc_double;
begin
  try
    // загружаем dll динамически
    hndDLLHandle := loadLibrary ( 'ExDouble.dll' );

    if hndDLLHandle <> 0 then
    begin

      // получаем адрес функции
      @calc_double := getProcAddress ( hndDLLHandle, 'calc_double' );

      // если адрес функции найден
      if addr ( calc_double ) <> nil then
      begin
        // показываем результат ( 21...)
        showMessage ( floatToStr ( calc_double ( 10.5 ) ) );
      end
      else
        // DLL не найдена ("handleable")
        showMessage ( 'Function not exists...' );

    end
    else
      // DLL не найдена ("handleable")
      showMessage ( 'DLL not found...' );

  finally
    // liberar
    freeLibrary ( hndDLLHandle );
  end;
end;

end.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay