Delphi’de DLL dosyalarını 2 türlü kullanabiliriz.
- Statik Kullanım
- Dinamik Kullanım
Bu ikisi arasındaki farkı daha iyi anlayabilmek için öncelikle örnek bir DLL hazırlayalım.
Bu örnekteki fonksiyon sadece verilen real tipindeki sayısı 2 ile çarpıp sonucu döndürecektir.
library ornekdll;
uses
SysUtils,
Classes;
{$R *.res}
function hesapla( r: real ): real; stdcall;
begin
result := r * 2;
end;
exports
hesapla;
begin
end.
yukarıdaki kodlara göre hazırlamış olduğumuz dll dosyamızı şimdi de projemizde kullanalım.
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 hesapla ( r: real ): real; stdcall; external ‘ornekdll.dll’;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
showMessage ( floatToStr ( hesapla ( 10.5 ) ) );
end;
end.
Burada görüldüğü gibi hesapla isimli fonksiyon OrnekDLL.DLL dosyasından alınmış ve kullanılmıştır. Eğer dll dosyamızın adı değişirse veya başka bir klasörde olursa programımız kesinlikle çalışmayacaktır.
Dinamik Kullanım:
Aşağıdaki örnekte dll dosyamızın adı değişse veya farklı bir klasörde olsa dahi programımız çalışacaktır. Tabi ki dll dosyamızın adını ve yolunu bir şekilde programımıza tekrar vermemiz gerekecektir.
unit untMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
Thesapla = 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;
hesapla: Thesapla;
begin
try
// verdiğimiz dll dosyasını yükle
hndDLLHandle := loadLibrary ( ‘ornekdll.dll’ );
if hndDLLHandle <> 0 then begin
// dll içinden hesapla isimli fonksiyonu bul
@hesapla := getProcAddress ( hndDLLHandle, ‘hesapla’ );
// eğer yüklenen dll içinde istediğim fonksiyon mevcutsa
if addr ( hesapla ) <> nil then begin
// sonucu 21 olarak görüntüle
showMessage ( floatToStr ( hesapla ( 10.5 ) ) );
end else
// Dll içinde fonksiyon bulunamadı mesajı ver
showMessage ( ‘Fonksiyon bulunamadı…’ );
end else
// DLL bulunamadı veya yüklenemedi mesajı ver.
showMessage ( ‘DLL bulunamadı…’ );
finally
// DLL ile işimiz bitince tekrar hafızadan kaldır
freeLibrary ( hndDLLHandle );
end;
end;
end.