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.
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.