Bir DLL Dosyasını Dinamik Olarak İthal Etmek

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Bir DLL Dosyasını Dinamik Olarak İthal Etmek

Mesaj gönderen vkamadan »

Merhaba ,
DLL dosyalarıyla sık sık çalışmam gerekiyor ve foruma gelen bir soru üzerine Güvenli ve mantıklı bir yöntem olan DLL yi Dinamik olarak yükleme metodundan bahsetmek istiyorum.

Örnek DLL Projesi aşağıdaki gibi olsun;

Kod: Tümünü seç

library TestDLL;


uses
  SysUtils,
  Classes;

{$R *.RES}


 function ToplamAl(Deger1 , Deger2:Integer):Integer;export;
 begin
   Result:= Deger1 + Deger2;
 end;

  exports
   ToplamAl;


begin
end.
DLL yi dinamik olarak yükleme adımı ;

Kod: Tümünü seç

   procedure DinamikDLLYukle;
   type
    TYuklenecekFonksiyon = function (Deger1, Deger2:Integer):Integer;
   var
      DLLHandle   :Integer;
      fncToplamAl :TYuklenecekFonksiyon;      
   begin
      DLLHandle := SafeLoadLibrary('TestDLL.dll');
        if DLLHandle<>0 then
          begin
            @fncToplamAl := GetProcAddress(DLLHandle , 'ToplamAl');
            if @fncToplamAl <> nil then ShowMessage(IntToStr(fncToplamAl(5,5)));
            FreeLibrary(DLLHandle);
          end;
   end;

Yukarıda yaptıklarımızı inceleyecek olursak , TYuklenecekFonksiyon adında DLL içinde tanımladığınız ToplamAl fonksiyonu ile aynı sayıda ve tipte parametre alıp aynı tipte sonuç döndüren bir fonksiyon tip tanımladık.
DLLHandle adında yüklenen DLL nin handle numarasının tutulacağı bir Integer değişken ve fncToplamAl adında TYuklenecekFonksiyon tipinde çağıracağımız fonksiyonun adres bilgisini yükleyip kullanabilmemizi sağlayan değişkeni tanımladık.
SafeLoadLibrary fonksiyonu na yükelencek DLL dosyasının adı verildiğinde eğer bir sorun yaşanmazsa geriye Yüklenen DLL nin Handle numarası döner, eğer sorun yaşanırsa geriye 0 değeri döner. biz sonucu DLLHandle değişkenine aldık ve yüklenip yüklenmediği kontrolünü yaptıktan sonra Sıra çağıracağımız fonksiyonun hafızada ki adresini alıp bunu yeni fonksiyon tipimize atayarak kullanmaya geldi , GetProcAddress fonksiyonu kendisine parametre olarak geçilen Handle numarasına sahip DLL içinde 2. parametre olarak geçilen fonksiyon yada procedure ismine sahip bir blok arar ve bulursa geriye geçerli bir Hafıza adresi döndürür, biz dönen adres değerini fncToplamAl fonksiyonumuzun hafoza adresine atatıktan sonra geçerli olup olmadığını kontrolünü yaptık ve doğrudan fonksiyonumuzu çağırarak kullandık.
Son olarak yüklenen DLL yi işimiz bitince hafızadan atmak için FreeLibrary fonksiyonuna DLLHandle ı parametre geçtik.


İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla