Dynamic-Link Kitaplıkları Hakkında

Dinamik bağlama, modülün yalnızca yük zamanında veya çalışma zamanında dışarı aktarılan DLL işlevini bulmak için gereken bilgileri içermesine olanak tanır. Dinamik bağlama, bağlayıcının kitaplık işlevinin kodunu çağıran her modüle kopyaladığı daha tanıdık statik bağlamadan farklıdır.

Dinamik Bağlama Türleri

DLL'de işlev çağırmak için iki yöntem vardır:

  • yük süresi dinamik bağlamamodül, dışarı aktarılan DLL işlevlerine yerel işlevlermiş gibi açık çağrılar yapar. Bunun için modülü, işlevleri içeren DLL'nin içeri aktarma kitaplığına bağlamanız gerekir. İçeri aktarma kitaplığı, sisteme DLL'yi yüklemek ve uygulama yüklendiğinde dışarı aktarılan DLL işlevlerini bulmak için gereken bilgileri sağlar.
  • çalışma zamanı dinamik bağlamamodülde, çalışma zamanında DLL'yi yüklemek için LoadLibraryveya LoadLibraryExişlevinikullanılır. DLL yüklendikten sonra modül, dışarı aktarılan DLL işlevlerinin adreslerini almak için GetProcAddress işlevini çağırır. Modül, getProcAddress tarafından döndürülen işlev işaretçilerini kullanarak dışarı aktarılan DLL işlevlerini çağırır. Bu, içeri aktarma kitaplığı gereksinimini ortadan kaldırır.

DLL'ler ve Bellek Yönetimi

DLL'yi yükleyen her işlem onu sanal adres alanına eşler. İşlem DLL'yi sanal adresine yükledikten sonra dışarı aktarılan DLL işlevlerini çağırabilir.

Sistem, her DLL için işlem başına başvuru sayısını tutar. Bir iş parçacığı DLL'yi yüklediğinde, başvuru sayısı bir artırılır. İşlem sonlandırıldığında veya başvuru sayısı sıfır olduğunda (sadece çalışma zamanı dinamik bağlantısı durumunda), DLL işlemin sanal adres alanından kaldırılır.

Diğer tüm işlevlerde olduğu gibi, dışarı aktarılan DLL işlevi de onu çağıran iş parçacığı bağlamında çalışır. Bu nedenle, aşağıdaki koşullar geçerlidir:

  • DLL'yi çağıran işlemin iş parçacıkları, bir DLL işlevi tarafından açılan tanıtıcıları kullanabilir. Benzer şekilde, çağırma işleminin herhangi bir iş parçacığı tarafından açılan tanıtıcılar DLL işlevinde kullanılabilir.
  • DLL, çağıran iş parçacığı yığınını ve çağırma işleminin sanal adres alanını kullanır.
  • DLL, çağırma işleminin sanal adres alanından bellek ayırır.

DLL'ler hakkında daha fazla bilgi için aşağıdaki konulara bakın: