Dinamik Dll Çağırma

Delphi .net ve .net ile ilgili konuları buraya yazabilirsiniz.
Cevapla
ferda
Üye
Mesajlar: 13
Kayıt: 07 Nis 2008 03:11

Dinamik Dll Çağırma

Mesaj gönderen ferda » 07 Nis 2008 04:57

Es selamü Aleyküm, aylarca bekledikten sonra aranıza katılmanın mutluluğunu yaşıyorum(7 nisan 2008).
Projemde bir MDI form var bu form üzerinde dinamik bir menü oluşturuyorum.Bu dinamik menülerin itemlerinin click olaylarında istediğim dll ve dll'in içerisindeki procedure yada fonksiyonu çağıran kodları yazıyorum.Yani programımı dll olarak parçalara ayırdım.bundaki maksadım, son kullanıcılar kendi menülerini tasarlayıp kendi dlllerinide yazarak programa istedikleri ilaveleri yapabilsinler.bunun için dll dosyalarının isimlerini ve içerisindeki fonksiyonların isimlerini bir veritabanından çalışma anında alınacak şekilde dizayn yaptım.dll dosyalarını dinamik olarak çağırma yönteminde offline v3 dosyanızda @vkamadan kardeşimiz gayet güzel açıklamış ve elimdeki diğer kaynaklarda benzer şekilde örnekler verilmiş.ama bir türlü dll dosyasını dinamik olarak çağıramadım. örnek kod ,

Kod: Tümünü seç

procedure TForm6.Button1Click(Sender: TObject);
var
  DLLRoutine: procedure;
  DLLHandle: THandle;
begin
  DLLHandle := LoadLibrary('C:\Documents and Settings\Ferda\Desktop\dll\DLLFormDll.dll');
  try
  DLLRoutine:=GetProcAddress(DLLHandle, 'KayitFormu');
    if Assigned(DLLRoutine) then
      DLLRoutine
    else
      MessageDlg('The specified routine cannot be found.',
        mtInformation, [mbOk], 0);
  finally
    FreeLibrary(DLLHandle);
  end;       // try..finally
end;
adım adım çalıştırdığımda ,

Kod: Tümünü seç

 DLLRoutine:=GetProcAddress(DLLHandle, 'KayitFormu');
bu satıra gelince [Pascal Error] Unit6.pas(44): E2010 Incompatible types: 'Procedure of object' and 'IntPtr' bu hatayı veriyor.
hata veren satırda DLLRoutine değişkenimin sol tarafına, pointer bilgisi atanabilsin için @ işareti yazıyorum bu sefer de aşağıdaki hatayı veriyor,

Kod: Tümünü seç

[Pascal Error] Unit6.pas(44): E2010 Incompatible types: 'Pointer' and 'IntPtr'
hatası veriyor. değişken tipleriyle ilgili bir sorun ama bir türlü çözemedim. Şimdiden teşekkürler.

antolog
Üye
Mesajlar: 3
Kayıt: 07 Oca 2008 11:05

Re: Dinamik Dll Çağırma

Mesaj gönderen antolog » 22 Haz 2008 05:33

Umarim aşağıdaki alıntı isinize yarar...

Alıntı :

{Örnek..: islem.dll dosyasında bulunan Topla isimli fonksiyonun 2 adet integer
sayı topladığını varsayıyoruz. Dll içinde

function Topla(Sayi1,Sayi2:Integer):Integer;stdcall;
begin
Result:=Sayi1+Sayi2;
end;

şeklinde yazılmış olsun. Biz bu fonksiyonu bir butona basarak çalıştıralım ama
dinamik olarak. Yani, dll yoksa program çalışabilecek bir yapı kuralım}


type
TDllFunc=function (A,B:Integer):Integer;
//Dll içinden kullanılacak fonksiyonun yapısı tip olarak tanımlanır

const
DllAdi='islem.dll';//Kullanılacak dll adı
FuncAdi='Topla';//dll içinden kullanılacak fonksiyon adı

procedure TForm1.Button1Click(Sender: TObject);
var
DllHandle:THandle;//dll fonksiyonu elde edecek değişken
Toplam:Integer;//işlem sonucunu tutacak değişken
Address:Pointer;//dll içindeki fonksiyonun adresi
_function:TDllFunc;//bu değişkene ise fonksiyon adresini atarsak her çalıştırmada dll içindeki fonksiyon çalışır
begin
DllHandle:=LoadLibrary(DllAdi);//Dll i hafızaya yükle
if DllHandle=0 {dll bulunamadı} then MessageBox(Handle,PChar(Format('%s dosyası bulunamadı...',
[DllAdi])),'Lütfen Dikkat...',MB_OK+MB_ICONWARNING)
else try
Address:=GetProcAddress(DllHandle,FuncAdi);//dll içindeki fonksiyon adresini bul
if not Assigned(Address) {dll içindeki adres bulunamadı} then MessageBox(Handle,PChar(Format(
'%s dosyasında gereken "%s" fonsiyon bulunamadı...',[DllAdi,FuncAdi])),
'Lütfen Dikkat...',MB_OK+MB_ICONWARNING)
else begin
_function:=TDllFunc(Address);//o adresi fonksiyona ata
//artık _function değişkeni dll içindeki Topla değişkenini gösterdiğinden onu her kullandığımızda dll içindeki fonksiyon çalışacaktır
Toplam:=_function(12,32);//dll fonksiyonu çalıştırılıyor
ShowMessage(IntToStr(Toplam));
end;
except
on E:Exception do begin //bir hata oluşursa oluşan hata
MessageBox(Handle,PChar(Format('%s dosyası tanımlanamdı...'#13#10'%s',
[DllAdi,E.Message])),'Lütfen Dikkat...',MB_OK+MB_ICONWARNING);
end;
end;
FreeLibrary(DllHandle);//hafızaya yüklenen dll, tekrar serbest bırakılarak işgal edilen bellek geri verilir
end;

Cevapla