Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3

Модерирует : ShIvADeSt

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

skinash



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
 
DLL возможно загружать двумя способами:  
 
- статически  
- динамически  
 
Давайте создадим простую библиотеку 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.

 


Всего записей: 145 | Зарегистр. 21-09-2006 | Отправлено: 13:32 10-09-2007
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru