23 Ekim 2012 Salı

DELPHI’DE DLL DOSYALARIN OLUŞTURULMASI



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.


ALLAH GÜZEL İSİMLERİ(ESMAÜL HÜSNA) VE KAİNAT VE KORONA VİRÜSÜNÜN HAYIRLI TARAFLARI

Kuranı kerimde Bakara 180 de"En güzel isimler Allah’ındır; bu güzel isimlerle O’na dua edin, O’nun isimleri hakkında doğru inançtan sap...