Burada anlatacaklarım, aslında kesin bilgilere değil, bildiklerimden çıkardıklarım üzerine olacak. Bu yüzden yazdıklarımı kesin doğru olarak düşünmeyin, hatta yanlışım varsa düzeltirseniz sevinirim
Windows, normalde uygulamaları çalıştırırken, her uygulama için sanal bir bilgisayar oluşturuyor. Daha doğrusu, her program için ayrı bir bellek alanı açıyor ve siz bu bellek alanı içinde çalışıyorsunuz. Dolayısıyla programınız çöktüğü zaman genelde sistem diğer programların çökmesini engelleyebiliyor. Ama ortak kullanım anlamına gelen BPL ve DLL'ler, sizin programınızla aynı bellek alanına yüklenemez. Aksi takdirde zaten DLL, BPL mantığını kaybedersiniz, çünkü aynı DLL'i kullanan programlar, DLL'leri iki kere yüklemek zorunda kalır. Sonuçta A programı, B programının bellek alanına erişemez, çünkü buna işletim sistemi izin vermez. Sanırım buraya kadar olan kısımda her DLL için işletim sisteminin farklı bir bellek alanı yaratacağını açıklayabilmiş oluyorum.
İşte işletim sisteminin kontrolleri derken anlatmak istediğim de burasıydı. Sizin programınız, aslında kendisine ait olmayan bir adrese ulaşmaya çalışıyor. Burada işletim sistemi devreye giriyor ve sizin kullanmak istediğiniz adresin geçerliliğini kontrol ediyor. Elbette sistemin buna yönetlik optimizasyonları vardır, ama kendi kodunuz çalışırken bu kontrol yapılmıyor, çünkü bu kontroller zaten compile edilirken hallediliyor.
Aynı zamanda şunu da eklemek gerekiyor, Delphi'de bir DLL yarattığınızda kocaman bir uyarı commenti görüyorsunuz:Eğer string tipi veri aktarımı yapacaksanız, Borlndmm.dll (adını tam hatırlamıyorum) gibi bir dosyayı da dağıtmanız gerekir. Diğer bir değişle, araya Borland'ın çevirimleri falan giriyor, büyük ihtimalle Delphi String'i Null terminated String'lere çevirerek uyumluluğu sağlıyor. Yani sizin yazdığınız kod, aslında sizin yazdığınız gibi çalışmıyor, ama aynı işi yapıyor

(Bu mesajlarda sürekli garip cümleler kuruyorum, kusuruma bakmayın)
Şimdilik çıkmam gerekiyor, eğer aklıma bir şeyler gelirse eklerim
Herkese kolay gelsin
Bahadır Alkaç