Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 303

•  TDictionary Custom Sort  6 348

•  Fast Watermark Sources  6 138

•  3D Designer  9 075

•  Sik Screen Capture  6 460

•  Patch Maker  6 877

•  Айболит (remote control)  6 859

•  ListBox Drag & Drop  5 734

•  Доска для игры Реверси  96 625

•  Графические эффекты  7 079

•  Рисование по маске  6 380

•  Перетаскивание изображений  5 251

•  Canvas Drawing  5 622

•  Рисование Луны  5 323

•  Поворот изображения  4 871

•  Рисование стержней  3 456

•  Paint on Shape  2 714

•  Генератор кроссвордов  3 591

•  Головоломка Paletto  2 884

•  Теорема Монжа об окружностях  3 690

•  Пазл Numbrix  2 424

•  Заборы и коммивояжеры  3 106

•  Игра HIP  2 067

•  Игра Go (Го)  1 992

•  Симулятор лифта  2 351

•  Программа укладки плитки  2 053

•  Генератор лабиринта  2 512

•  Проверка числового ввода  2 199

•  HEX View  2 526

•  Физический маятник  2 141

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Динамическая и статическая загрузка 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.





Похожие по теме исходники

DLL Form

DLL in Resources

DLL Injector




Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте