Delphi Dünyası Facebook'ta

Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

Gönderen Konu: DLL Oluşturma  (Okunma sayısı 4853 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
DLL Oluşturma
« : 08 Ekim 2005 16:21:24 »
Delphi de Dll olusturmak oldukca basittir. Fakat önce Dll mantigini biraz anlamak gerekir.
Dll uzantili dosyalar yalnizca program icerisinden cagrilabilirler.
bir dll belirli komutlari belirlenmis bir Procedure gibidir.
siz Procedure e bir parametre gönderirsiniz karsiliginda yanit alirsiniz.
Dll; icerisine tanimlanmis degerler kümesi yüklemis bu bir fonsiyon ,
Procedure veya sabit olabilir. dll programa dinamik olarak baglanmaz ,
sonucta bir dosya oldugu icin Exe den bagimsiz olarak calisir bunun
bir cok olumlu tarafi vardir deneyimli programci arkadaslar zaten bir
cogunu biliyor. önemli buldugum bir kac tanesi
Dll programin Exe koduna yalnizya calisma aninda yüklenir. buda dogal olarak
Programin boyunu büyük ölcüde düsürür.
Dll sistem hafizasina bir kez yüklenir buda sizin hiz problemlerinize azda olsa
cözüm bulmaniz demektir. dll bir dosya tipi oldugu icin ve programinizdan
bagimsiz derlendigi icin icerisinde degisiklik yapabilirsiniz
( tabiki kendi programiniza göderdiginiz Fonsiyon veya parametreleri degistirmesseniz )
Dll ler olumlu oldugu kadar bircok olumsuz yani da var en önemlisi Dll lerin boyutlari
oldukca büyük bu belki sadece Delphi compiler'inda derlendigi icin olabilir.
( Delphi 3 sürümünden itibaren Dll dosyalarinda hata bulma ve gidermeye
yönelik eklemeler yapildi , bu diger programlama dillerinden cagrilmasini kolaylastirmak
ve o dillerdeki hatalara karsi kendi önleminizi almaniz icin; örnegin Visual basic te
veya Microsoft office ortaminda calisan bir Delphi dll 'i kendi hatalarini
düzeltebilir yapacaginiz hatalardan birinin sifira bölme gibi bir islem oldugunu
düsünün. bu hatayi en basit Try.. Except bloguna alip halledebilirsiniz. ama maalesef
diger programlar Try gibi degiskenin ne ise yaradigini anlamaz ve Vb de sik raslanan
runtime Error alip progami sonlandirmak zorunda kalirlar.
 

Delphi de dll olusturmak icin sadece ne yapmak istediginize karar verin hepsi bu geriye sadece bir kac ezber sözcük kaliyor. tabiki karmasik olan bir dll de olusturabilirsiniz. bunun icin biraz bilgi ve oldukca
yüksek sabriniz olmasi gerekir.
Delphi de dll olusturmanin en basit bir kac adimi su sekildedir

tüm acik project ve unitlerinizi kapatin File - CloseAll
 

önce File-New menüsünden Other seçeneğini seçtikten sonra çıkan pencerenin New sekmesindeki DLL Wizad’ı seçin.

Bu işlemden sonra aşağıdaki gibi bir kod  penceresi karşımıza çıkacaktır.



Yazacağımız function, procedure veya değişken tanımlarını Begin satırından önce yazmamız, eğer bu functionar dışarıdan çağrılabilecekse function tanımının sonunda Export deyimiyle bunu bildirmemiz gerekir

>          Dll dosyaları F9 tuşu ile çalıştırılmazlar. Derlemek için Ctrl+F9 tuşlarını veya Project-Compile seçeneğini kullanmalısınız. Bu işlem sonrasında proje exe olarak değil dll uzantısına sahip olacaktır.

>          Dll dosyaları tasarlarken çalıştırıp sonucu test etmek zor olduğu için functionları bir projede hazırlayıp en son haliyle bir dll projesine kopyalamak daha kolay olacaktır.

>          Herhangi bir dll dosyasından bir function çağırmadan önce aşağıdaki gibi tanımlamamız

 Dll kullanarak ekrana bir mesaj cikaralım
ilk önce actiginiz unit kayit edin. bu yapabilecegimiz en basit orneklerden
daha sonra size bir formun Dll icerisine nasil atilacagini gösterecegim.

Kod: [Seç]
library deneme;
uses
Dialogs,
Windows;

procedure MesajGoster;
begin
MessageDlg('ORNEK DLL UYGULAMASI ',mtConfirmation,[mbok],0);
end;
// exports ifadesi olusturulan procedure nin
// baska programlardan cagirilabilmesi icin
exports
MesajGoster;

begin
end.


yukaridaki kod derlandikten sonra
olusturulan dll i kendi programimizdan nasil cagirilcagini gösterecegim
yeni bir uygulama yaratin ve dll ile ayni dizine kaydedin veya Dll dosyasini
programinin bulundugu dizine alin veya Dll in hangi dizinde oldugunu
belirterekte calistirabilirsiniz.

 iste size ilgili formun Button click olayina
yazilmis MesajGoster uniti :
Kod: [Seç]
 .
  .
private
public
end;
  procedure MesajGoster; external 'Deneme.dll';
var
  Form1: TForm1;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
MesajGoster;
end;

end.


eger Dll iniz bulunulan dizinde degilse bir hatayla karsilasirsiniz
sunu deneyebilirsiniz: dll iniz örnek olarak c:\Belgerim\Deneme
Dizininde oldugunu varsayalim sadece ilgili kod kismini
su sekilde degistirin
procedure MesajGoster; external 'c:\Belgerim\Deneme\Deneme.dll';
bunu göstermemin nedeni sadece bir karisikligi önlemek

DLL'de Form Kullanmak

   Delphi formunu bir Dll icerisine atmak oldukca basit daha önceki örnege benzer bir
uygulama ile devam edecegim.
1- yeni bir dll projesi acin File - New -  New/Dll ;
2- File new form komutlariyla bir form acin ;  Formu İstediğiniz gibi Tasarlayın
Form unitini asagidaki gibi tamamlayin

Kod: [Seç]
unit UFormDll;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
  TForm1 = class(TForm)
  private
  public
  end;
    Procedure ShowFormDll ;
var
  Form1: TForm1;
implementation
{$R *.DFM}

Procedure ShowFormDll ;

// Kullanımı zorunludur. Dll içinden bu Procedureyi Çağırmalısınız.

//Kod Formun Oluşturulmasını Sağlar
Begin
   Form1:= TForm1.Create(application);
   Form1.Showmodal ;
   Form1.Free;
   Form1 := nil ;
end ;

end.



ben unit ismini UFormDll olarak sakladim. project ismimide FormDll olarak
sakladim.
simdi Library unitine gecin ve ilgili kodu asagidaki gibi tamamlayin

Kod: [Seç]
library FormDll;
uses
  SysUtils,
  Classes,
  UFormDll in 'UFormDll.pas' {Form1};

exports

 

ShowFormDll ;

{$R *.RES}
begin
end.


Uygulmanızdan Daha önce Gösterdiğim şekilde Prosedureyi Çağırdığınızda dll'den oluştıurduğumuz formun gösterildiğini göreceksiniz.

Kod: [Seç]
Exports:
Exports ifadesi sizin yazdiginiz Dll deki procedure veya fonsiyonlari
diger programlardan cagirabilmeniz icin ;
daha dogrusu ihrac edebilmeniz icin yardimci olur. yazdiginiz Dll' in
Exprots bloguna alinmamis Procedure veya parametre unitleri
diger programlardan cagirilamaz.
örnegin
Exports ifadesini asagidaki gibi degistirebiliriz
Exports
ShowFormDll name 'ShowForm' ;


bu ifade form icerisinde kullandigimiz ShowFormDll adli procedureyi
diger taraftan showForm olarak cagirmamizi saglar bu sekilde
eger bir program yapip icerisinde onlarca dll olusturdugunuzu düsünün
her durumda zaten bir isim cakismasi olmaz ama yinede
yazdiginin kodlari anlamli isimlendirmek daha rahat calismanizi saglar.

bununla ilgili bir örnek te delphi icesinde vardir;  MessageBox fonsiyonu
ekrana istenilen bir mesaji cikaran dialog kutusudur ve bir windows API sidir
delphi  USER32.DLL icerisinden su sekilde cagirir.

Kod: [Seç]
function MessageBox(HWnd: Integer; Text, Caption: PChar; Flags: Integer): Integer;
  stdcall; external 'user32.dll' name 'MessageBox';

burada siz Delphi yi kullandiginiz sürece  MessageBox Fonsiyonu his degismez.
tabiki radikal bir karar alip Delphi yi yazanlar degistirmedikce ayni
sey UserDll icerisindeki Fonksiyon icinde gecerli.

Library : Delphi nin calistirilabilir dosya yerine; bir dll olusturmak istedigimizi bildiriyoruz

StdCall : Bu rutin Dll icerisine parametre gönderebilmek icin gerekli;

External : Bu rutin Delphi icersininden bir Dll 'i cagirmak icin gerekli parametrelerden biridir.
Fakat yalnizca Dll icin kullanilmaz.
Delphi icerisinden cagirdiginiz bazi dosyalardan ; ilgili fonksiyon veya procedureleri cagirmak
icinde kullanabilirsiniz. örnegin unit ismi ile ayni olan bir obj dosyasi oldugunu
( obj dosyalari delphinin Derlenmis Dcu dosyalarina benzer ikilik dosya tipidir ve C formati tasir )
varsayalim ve bu dosyada Procedure DenemeMesaj; gibi bir Procedure oldugunu varsayarsak
bu procedure yi Delphi den
Kod: [Seç]
{$LINK}
{$L *.OBJ}
Procedure DenemeMesaj;External; ifadesini kullanarak acabiliriz.
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı Opt2000

  • Global Moderatör
  • *****
  • İleti: 263
  • Rep: +9/-1
  • Cinsiyet: Bay
DLL Oluşturma
« Yanıtla #1 : 08 Ekim 2005 16:23:55 »
DLL kullanmakla ilgili bir iki notta ben ekleyim.

Yukarıdaki örnekte DLL dosyası EXE programa birleştirilerek anlatılıyor. Yani programın çalışması için ilgili DLL'nin de olması gerekmektedir. Oysa bu kimi durumlarda uygun değildir. Örneğin Photoshop veya 3DMax gibi Plug-in destekli programları düşünün. Bunların Plug-inleri elbette DLL dosyalarıdır. Siz program çalışırken dinamik olarak bir DLL dosyasını yükleyip, içinde adını bildiğiniz bir fonksiyonu çağırabilirsiniz. Aşağıda DLL kodundaki fonksiyonu yazıyorum.

Kod: [Seç]
procedure DisplaySum(A,B:integer);stdcall;
begin
   MessageBox(Handle,PChar('A + B = ' + IntToStr(A+B)),'Dinamik DLL',MB_OK);
end;

exports
   DisplaySum;

Burada stdcall calling conversion olarak adlandırılır ve eğer yazdığınız DLL'nin bu yöntemle çağrılmasını istiyorsanız conversion metodunu belirmek zorundasınız. stdcall, Windows tarafından kullanıldığı için ben de genelde bunu kullanırım.

Şimdi EXE programına geldik. Burada önce fonksiyon prototype'ını tanımlamamız gerekiyor.

Kod: [Seç]
type TSumFunction=procedure (A,B:integer);stdcall;

şimdi Hesapla fonksiyonunda da şu kodları ekleyelim

Kod: [Seç]
procedure Hesapla(A,B:integer);
var
   DLLHandle:THandle;
   AFunction:TSumFunction;
begin
   //DLL dosyasını belleğe alalım
   DLLHandle:=LoadLibrary('DLL_Path_AND_NAME');

   //Fonksiyonun adresini alalım
   AFunction:=GetProcAddress(DLLHandle,'DisplaySum');

   //Fonksiyonu çalıştıralım
   AFunction(A,B);

  //Fonksiyonu bellekten silelim
   FreeLibrary(DLLHandle);
end;


Buraya kadar yazdıklarım, Fatih'in yöntemine göre biraz amelece gelebilir, ama çok büyük bir avantajı var. Bu yöntem sayesinde programlarınıza Plug-In geliştirmek sadece iyi bir tasarıma kalmış olacak.

DLL kullanılırken en çok dikkat edilmesi gereken kısım bellek kayıplarıdır. EXE'de tanımladığınız bir değişkeni, kafanıza estiği gibi DLL'ye gönderemezsiniz. Daha doğrusu her zaman gönderemezsiniz. Özellikle New veya Getmem ile aldığınız bellek adreslerini gönderecek olursanız, yüksek olasılıkla programınız göçecektir. Bunun sebebi ise işletim sisteminin bellek yönetimidir. Bu gibi durumlarda mümkün olduğunca GlobalAlloc fonksiyonu ile belleği Windows'a açtırın. Bir de DLL dosyaları içinden string kullanmamanızı tavsiye ederim. Bunun yerine PChar kullanın. Ve hatta bunu bir adım ileri götürmekte fayda var. DLL içinde sadece standart veri türlerini kullanın. Integer, char, pointer gibi. Ve parametreleri cast ederek istediğiniz veri türüne dönüştürün.

Şimdilik bu kadar

Herkese kolay gelsin

Çevrimdışı Acar78

  • Delphi 1 Level 2
  • **
  • İleti: 14
  • Rep: +0/-1
Ynt: DLL Oluşturma
« Yanıtla #2 : 18 Aralık 2005 10:47:09 »
Merhabalar;
Benim Delphi7 ve Paradox kullanarak yapmış olduğum ve 8 tane ayrı exe'den oluşan bir projem var.
Bu 8 tane ayrı Exe'yi Dll haline getirip bir programdan çağırarak çalıştırmam mümkün mü? Mümkünse nasıl yapabilirim? Saygılar...

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Re: DLL Oluşturma
« Yanıtla #3 : 18 Aralık 2005 11:32:35 »
exeleri dll'ye çeviremenin ek mümkün olacağını sanmıyorum. sil baştan dll olarak yapman gerek.
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı kapgan

  • Delphi 1 Level 1
  • *
  • İleti: 4
  • Rep: +0/-0
Ynt: DLL Oluşturma
« Yanıtla #4 : 24 Aralık 2006 18:55:28 »
bunun kolay yolu var bir exeyi res edebilir bir ana programndan çaığrabilirsin