Tuesday, 9 April 2013

Dll Dosyanızı Yüklerken


Dll dosyasının Windows tarafından otomatik aranmasını istemiyorsanız ve yükleyeceğiniz dll dosyanızın yolunu vererek yüklemek istiyorsanız (bu ihtiyaç dll dosyasını izole etmek veya Dll Hell denilen versiyonlama farkları hatalarına düşmemek için olabilir) iki tane çözüm yolunuz var.

1- Eğer dll dosyasını bir exe içerisinden çağırıyorsanız .local dosyasını kullanabilirsiniz.

Örneğin do_things.exe çalıştırılabilir dosyanız ve other_things.dll de dinamik kütüphaneniz olsun. Şimdi aşağıdaki isimde bir dosya yaratın ve do_things.exe dosyası ile aynı klasöre kopyalayın.

do_things.exe.local 

Ayrıca other_things.dll dosyasını da aynı klasöre kopyalayın. Klasör içerisinde

do_things.exe
do_things.exe.local (boş bir dosya, içeriği yok)
other_things.dll

dosyaları mevcut olsun. Artık Windows .local dosyasını gördüğü için ilk olarak other_things.dll dosyasını do_things.exe dosyası ile aynı yolda arayacak, bulacak ve yükleyecektir.

Bu güzel bir yöntemdi fakat bazı durumlarda işimizi çözmeyebilir. Örneğin yüklemek istediğimiz dll dosyasını başka bir dll dosyasından yüklemek istiyorsak ve o başka dll dosyası da exe dosyası ile aynı yolda değilse ve olacağının bir garantisi yoksa .local dosyası işimizi çözmüyor demektir.

2- Delay Load Dll: Böyle bir durumda insanın aklına şu gelyor, keşke LoadLibrary ile kendim yüklesem ama GetProcAddress ile yapılması gereken işleri yapmasam!

Evet bu mümkün. Tek yapmanız gereken Visual C++ içerisinden

Project Properties --> Linker --> Input 

altında bulunan Delay Loaded Dlls seçeneğine dll dosyasının ismini vermek. Ardından kod içinde münasip bir yere LoadLibrary satırını eklemek. Hepsi bu!

Bu yöntem ile dll dosyanızı istediğiniz zaman, istediğiniz yerden yükleyebilirsiniz.

Volkan Özyılmaz