DLL freelibrary

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

DLL freelibrary

Mesaj gönderen comfort »

Herkese iyi çalışmalar.

1)
Arkadaşlar projem 1 EXE ve DLL lerden oluşacak. Mevcut exeden çağırılan modüllere göre dll lerden formları çağırıp gösteriyorum. Bu arada anaformum MDI. Ve dll lerdeki formlar mdichild. Formlar açılıyor ve sıkıntısız çalışıyor. Lakin projemde hiç freelibrary kullanmadım ve işin aslı nerede çağıracağımı bilemiyorum.projem birçok DLL ve formdan oluştuğu için hangi library ' yi ne zaman free edeceğim.Acaba bu handle ları array de tutup program kapanırken tümünü free yapsam mı?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: DLL freelibrary

Mesaj gönderen sabanakman »

.exe kapatılırken bildiğim kadarıylar kullanılan .dll'ler serbest kalmaktadır. Hele .dll'lerini LoadLibrary ile çağırmıyorsan işin o tarafını hiç düşünme bile.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: DLL freelibrary

Mesaj gönderen ikra »

Selamun aleykum.

Konu ayni oldugu icin yeni bu baslik altinda devam ediyorum.

Dll lerin program sonuna kadar bellekte kalmasi dynamicload yapisina ters degil mi?

Modal gosterdigim bir formun finally blogunda librarysini free edebiliyorum fakat normal modda goaterilen bir formun librarisini otomatik olarak nasil free edecegim?

Mesajlara hook attim ve childin kapanisini yakalayip kendisine ait olan dll nin handlesini bosaltmaya calistim. Sonuc access violation. Oysaki freelibrary isleminden sonra ne uretilen forma nede ait oldugu dll nin proclarina erisim soz konusu degil.

Siz dll nin librarisini ne zaman bosaltiyorsunuz?
kıdemsiz üye
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: DLL freelibrary

Mesaj gönderen omurolmez »

Ortada biraz kavram kargaşası var.

Windows dll leri exe ye iki biçimde bağlanabilir :
1 .static linking
Derleyici, kodda library bildirisi bulunan tüm işlevler için, exe header ına library adını ve işlev adını yerleştirir.
Windows, bir programı başlatacağı zaman, exe ile birlikte, exe header ında geçen tüm library leri hafızaya yükler ve exe deki işlev adlarına, bu library lerin hafızadaki konumuna bağlı olarak işlev konumlarını yerleştirir. _Tam olarak böyle değil ama kabaca_ artık exe deki harici işlev çağrıları, hafızadaki gerçek pozisyonlarına jump komutlarına dönüştürülmüştür. Eğer bu sırada, en az bir dll bulunamazsa veya en az bir işlev adı, exe header ında belirtilen ile eşleşmezse, tüm işlem iptal edilir ve uygun bir hata verilir.
Eğer tüm dll ve işlevlerin hafızaya yüklenmesi tamamlanırsa, bir kaç başka ayrıntıdan sonra, programın hafızadaki kopyası çalıştırılmaya başlanırn (ana kanal yaratılır ve ana kanal üstünden WinMain işlevi çağrılır).

Bu biçimde, exe görüntüsü hafızada durduğu sürece tüm dll lerin görüntüleri de hafızada tutulur. exe görüntüsü hafızadan atıldığında (exe durduğunda değil), dll ler de hafızadan atılır.

Tüm süreç derleyici ve işletim sistemi tarafından yönetilmektedir, kod ile yapılacak bir şey yoktur (dll WinMain işlevi ayrı bir konudur).

Windows kitaplığının çok büyük bölümü programlara static linking ile bağlanır. Bir çok api, VCL de sonunda dll içindeki işlev çağrılarına döner (external; library;).

2. dynamic linking
Ne derleyici ne de işletim sistemi, programın ihtiyaç duyduğu dll ler hakkında bilgi sahibidir.
Dll de kullanacağınız işlev prototipini, işlev pointer ı biçiminde tanımlarsınız. Programınızda istediğiniz bir anda LoadLibrary çağırarak, istediğiniz dll lin yüklenmesini sağlarsınız. Daha sonra, içinden istediğiniz işlevin adresini alır ve tanımladığınız işlev pointer ına atarsınız. Artık işlev pointer ınızı bir işlev olarak çağırabilirsiniz.
İşte bu yöntemde, kural olarak, FreeLibrary çağırmalısınız. FreeLibrary yi ne zaman çağıracağınız, tasarımınıza bağlıdır. Ama en geç program sonunda çağırmanız gerekir. Öte yandan, Windows, bir exe hafızadan atıldığı zaman, o exe nin kullandığı tüm sistem kaynaklarını da otomatik olarak (eğer başka kullanan yoksa RefCnt) hafızadan atar. Ama işi Windows a bırakmak, iyi bir programlama alışkanlığı değildir.

Windows kitaplığının bir kısmı, sürüm farkları, işlemci farkları vb farkları yönetebilmek için, programlara dynamic linking ile bağlanır. Bu api tanımları, VCL de ilk çağrıldığında veya tanımlı unit in initialization kısmında bazı testlere göre LoadLibrary çağıran işlevler olarak tanımlıdırlar.

Son olarak, burada bahsedilen formların hafızadan atılma işlemleri ile, dll in hafızadan atılma işlemi aynı anlama gelmemektedir. Örneğin,

Bir memory.dll dosyası ve içinde Malloc ve Free işlevleri olsun. Şu algoritmayı yazabilirim :

program DynamicLinking
LoadLibrary(memory.dll); //dynamic linking
var
a: pointer;
begin
try
a :=memory.Malloc(1 MB);
try
//çeşitli işlemler
finally
memory.Free(a);
end;
finally
FreeLibrary memory.dll; //dynamic linking
end;
end.

Gördüğünüz gibi, hem dll işlevini kullanarak edindiğim kaynak (bu örnekte hafıza, sizin sorunuzda form nesnesi) hem de dll in kendisi ayrı ayrı yokediliyor. Static linking kullansam bile, yine de dll işlevi kullanarak edindiğim kaynağı tercihen aynı dll in başka bir işlevi ile yok etmem gerekiyor.

program StaticLinking
var
a :pointer;
begin
a :=memory.Malloc(1 MB);
try
//çeşitli işlemler
finally
memory.Free(a);
end;
end.

Kaynakların hafızadan ne zaman atılacağı
1. İhtiyacınız olduğu anda yaratır, işiniz biter bitmez atarsınız. Minimum hafıza tüketimi sağlarsınız.
2. İhtiyacınız olduğu anda, olacağı anda (daha üst menü açılırken) veya program başında yaratır, program sonuna kadar tutarsınız. Maksimum performans sağlarsınız.
3. On dakika boyunca kullanılmadığında atarsınız. Bu bir çeşit garbage collection dır ve hafıza ve performans optomizasyonudur.
4. Tükettiğiniz hafıza belli bir miktara ulaşana kadar, tümünü hafızada tutarsınız. Miktarı geçerseniz, kullanılmayan en eski kaynaktan başlayarak yeteri kadarını hafızadan atarsınız. Bu bir çeşit garbage collection dır ve hafıza ve performans optomizasyonudur.
Ömür Ölmez
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: DLL freelibrary

Mesaj gönderen ikra »

makale gibi cevap olmus. ellerine saglik.
tesekkür ederim : ))
kıdemsiz üye
Cevapla