Windows
kullanıpta .dll uzantılı dosyaları
görmeyen yok gibidir. Bu yazımda dll dosyalrın kısaca ne işe yaradığını
ve nasıl oluşturulacağını anlatmayı amaçladım. Özellikle .exe ‘leri büyük olan programcılar ve aynı fonksiyonu defalarca kullanmak
zorunda kalan programcılara .dll uzantılı dosya oluşturmalarını ve
kullanmalarını tavsiye ediyorum.
Açık
adı Dynamic-Link Library olan ve uzanatısı .dll olan DLL dosyalar içlerinde pek
çok fonksiyonu barındıran bir çeşit kod ve kaynak kütüphanesidir. DLL’ler .EXE
dosyalar gibi tek başına çalışmazlar. Bir DLL dosya başka bir .dll uzantılı ya
da .exe uzantılı dosyalar tarafından kullanılır. Bir DLL dosyaya ancak içindeki
bir fonksiyon veya kaynak kullanılacaksa
başvurulur. Bir windows uygulaması bir DLL dosyadaki fonksiyona, iki yoldan erişilebilir.
Extranal
bildirim kelimesi kullanılarak dll’deki
fonksiyon statik olarak ithal edilir. (static import veya impilct
loading -dahili yükleme-). Bu durumda DLL, onu kullanan EXE program çalışmaya
başlamadan yüklenir. Bu durumda eğer
kullanılan DLL bilgisayarda yoksa veya çalışmazsa, onu kullanan EXE program hiç
çalışmaz. DLL’in içindeki bir fonksiyon adı ile, yeni bir ad ile veya indeks
ile çağrılabilir. Statik olarak DLL kullanımının avantajı programın çalışma hızının
artmasıdır.
2.GetProcAddress
and LoadLibrary ve FreeLibrary adlı windows API fonksiyonları kullanılarak dll
dosyanın içindeki fonksiyonlar dinamik olarak kullanılabilir.( dynamic import
veya explict loading -harici yükleme-) .Bu fonksiyonlar Win. 3.x ve Win95 de
var. Dinamik olarak DLL kullanımın avantajı exe dosyanın boyu küçülür ve DLL
sadece kullanıldığı zaman hafızada yer kaplar. Bazı çok özel durumlarda ise
uygulamaların ortaklaşa kullandığı DLL ‘lerin hafızadan silinmesi veya bazen de
silinememesi problemi ortadan kalkar. Diğer bir avantajı ise DLL dosya
bilgisayarda yoksa ve çalışmazsa onu kullanan EXE program çalışır. Dezavantajı
ise çağırılan DLL fonksiyonunun çalıştırılması esnasında program hızı DLL’in
hafızaya yükleniyor olması yüzünden biraz yavaşlamasıdır.
Pek
çok dilde DLL geliştirilebilir ama bu yazımda çok popüler olan Delphi’de, DLL
dosya oluşturmayı ve daha az bilindiği için dinamik olarak DLL fonksiyonun
kullanılmasını anlatamayı tercih ettim.
Delphi’de
bir DLL dosya hazırlamak ve kullanmak diğer dillere nazaran oldukça kolay.
Delphi’ de tek formlu bir exe dosya oluştururken project source LISTE 1 deki
gibidir ve Delphi tarafından bu project
source otomatikman hazırlanır. Delphi’nin View menu seçeneğinden Project Source
seçeneğini seçerseniz, project source’un yazım penceresi açılır. Bu project
source üzerinde yapılacak ufak tefek değişikliklerden sonra .dll uzantılı bir
dosya elde edilebilir.
*****************
LİSTE 1******************************
program
Projet1;
uses
Forms,
unit1 in 'UNIT1.PAS' {Form1};
{$R
*.RES}
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
*******************************************************************
Eğer
project source üzerinde aşağıdaki değişikler yapılacak olursa derleme sonucunda
elde edilecek dosya, .dll uzantılı bir dosya olacaktır (yani project1.dll).
:
****************LİSTE
2*******************************
library
Project1; {1. program yerine
library kelimesi yazılır }
uses { 2.Forms sözcüğü kaldırılır. }
unit1 in 'UNIT1.PAS' {Form1};
exports
kullanim;
{3. exports sözcüğü eklenir. Kullanıma
hazır olan fonksiyonunun isimi verilir.
}
{$R
*.RES}
begin { 4. ana bloktaki kodlar kaldırılır. }
end.
*********************************************
Şimdi
bir dll dosya oluşturma ve bu dll dosyadaki fonksiyonun kullanımına ilişkin
örneği inceleyelim.
LISTE
3’Te te bir fonksiyonu olan sifre.dll
dosyanın project source verilmiştir.
********************LİSTE
3 - SIFRE.DPR************************
library
Sifre;
uses
Dllsifre in 'DLLSIFRE.PAS' {KontrolForm};
exports
SifreDogruMu;
{kulanılacak olan fonksiyon}
{$R
*.RES}
begin
end.
********************************************
SIFRE.DPR
içinde bildirilen olan SifreDogruMu fonksiyonu, SIFRE.DLL’i çağıracak uygulama
tarından kullanılacağından export
bilidirimli olarak DLLSIFRE.PAS dosyasında
tanımlıdır. SifreDogruMu fonksiyonu SifreyiAl parametresiyle gelen şifreyi alır
ve doğru şifre olan ‘BYTE’ kelimesi ile karşılaştırır. Eğer SifreyiAl
parametresi ile gelen kelime ‘BYTE’ ise formu açar ve geri dönüş değeri olarak
‘True’ değerini yollar, değilse ‘Yalnış Şifre’ mesajını verir ve geri dönüş değeri
olarak ‘False’ değerini yollar. DLLSIFRE.PAS Liste 4 ‘te verilmiştir.
ŞEKIL
1 dllsifre.pas’ın formu
********************
LISTE 4 DLLSIFRE.PAS*****************************
unit
Dllsifre;
interface
uses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Buttons;
type
TKontrolForm = class(TForm)
BitBtn1: TBitBtn;
Label1: TLabel;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
SIFRE:String;
{ Public declarations }
end;
var
KontrolForm: TKontrolForm;
function SifreDogruMu(SifreyiAl:String)
:Boolean;export;
implementation
{$R
*.DFM}
procedure
TKontrolForm.BitBtn1Click(Sender: TObject);
begin
Close;
end;
function
SifreDogruMu(SifreyiAl:String) :Boolean;
begin
Result::=False;
KontrolForm:=TKontrolForm.Create(Application);
try
if (SifreyiAl='BYTE') then
begin
KontrolForm.ShowModal;
Result::=True;
end
else MessageDlg('Yalnış Şifre',mtWarning,[mbOk],0);
finally
KontrolForm.Free;
end;
end;
end.
***********************
**************************************
SIFRE.DLL’i
çağıran DLLCAGIR.EXE’nin project source LİSTE 5’te verilmiştir.
ŞEKIL
2 -dllcagir.exe ‘nin penceresi
***********LISTE
5 -DLLCAGIR.DPR-***************************
program
Dllcagir;
uses
Forms,
Cagir in 'CAGIR.PAS' {Form1};
{$R
*.RES}
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
**********************************************
Liste
6 ‘de sifre.dll ‘in içindeki SifreDogruMu fonkksiyonunu çağıran cagir.pas’ın
kodu verilmiştir.
*******************LISTE
6 CAGIR.PAS********************
unit
Cagir;
interface
uses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ButtonSifre: TButton;
ButtonKapat: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure ButtonKapatClick(Sender:
TObject);
procedure ButtonSifreClick(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R
*.DFM}
procedure
TForm1.ButtonKapatClick(Sender: TObject);
begin
Close;
end;
procedure
TForm1.ButtonSifreClick(Sender: TObject);
var
tutacak:THandle;
SifreSonuc:
function (SifreyiAl:String) :Boolean;
begin
try
tutacak:=LoadLibrary('SIFRE.DLL');{sifre.dll
harici olarak yükleniyor}
@SifreSonuc:=
GetProcAddress(tutacak,'SifreDogruMu');
{SifreDogruMu Fonksiyonunun adresi işaretçiye
veriliyor}
SifreSonuc(Edit1.Text);
{SifreDogruMu fonksiyonu SifreSonuc işaretçisi
tarfından çağırılıyor}
finally
FreeLibrary(tutacak); {sifre.dll hafızadan
siliniyor}
end;
end;
end.