Visual Studio'da C/C++ DLL'leri oluşturma

Windows'da dinamik bağlantı kitaplığı (DLL), paylaşılan işlev ve kaynak kitaplığı işlevi gören bir yürütülebilir dosya türüdür. Dinamik bağlama bir işletim sistemi özelliğidir. Yürütülebilir dosyanın işlevleri çağırmasını veya ayrı bir dosyada depolanan kaynakları kullanmasını sağlar. Bu işlevler ve kaynaklar, bunları kullanan yürütülebilir dosyalardan ayrı olarak derlenebilir ve dağıtılabilir.

DLL tek başına yürütülebilir dosya değildir. DLL'ler, onları çağıran uygulamalar bağlamında çalışır. İşletim sistemi DLL'yi bir uygulamanın bellek alanına yükler. Uygulama yüklendiğinde (örtük bağlantı) veya çalışma zamanında isteğe bağlı (açık bağlama) yapılır. DLL'ler, işlevleri ve kaynakları yürütülebilir dosyalar arasında paylaşmayı da kolaylaştırır. Birden çok uygulama, bellekteki bir DLL'nin tek bir kopyasının içeriğine aynı anda erişebilir.

Dinamik bağlama ile statik bağlama arasındaki farklar

Statik bağlama, statik kitaplıktaki tüm nesne kodunu, oluşturulduklarında bunu kullanan yürütülebilir dosyalara kopyalar. Dinamik bağlama yalnızca Windows'un çalışma zamanında bir veri öğesi veya işlevi içeren DLL'yi bulup yüklemek için ihtiyaç duyduğu bilgileri içerir. DLL oluşturduğunuzda, bu bilgileri içeren bir içeri aktarma kitaplığı da oluşturursunuz. DLL'yi çağıran bir yürütülebilir dosya oluşturduğunuzda bağlayıcı, Windows yükleyicisi için bu bilgileri depolamak için içeri aktarma kitaplığındaki dışarı aktarılan simgeleri kullanır. Yükleyici bir DLL yüklediğinde, DLL uygulamanızın bellek alanına eşlenir. Varsa, DLL dosyasındaki özel bir işlev, DllMainDLL'nin gerektirdiği herhangi bir başlatmayı yapmak için çağrılır.

Uygulamalar ve DLL'ler arasındaki farklar

DLL'ler ve uygulamalar yürütülebilir modüller olsa da, bunlar çeşitli şekillerde farklılık gösterir. En belirgin fark, DLL çalıştıramamanızdır. Sistemin bakış açısından, uygulamalar ve DLL'ler arasında iki temel fark vardır:

  • Bir uygulamanın sistemde aynı anda çalışan birden çok örneği olabilir. DLL yalnızca bir örneğe sahip olabilir.

  • Bir uygulama işlem olarak yüklenebilir. Yığın, yürütme iş parçacıkları, genel bellek, dosya tanıtıcıları ve ileti kuyruğu gibi öğelerin sahibi olabilir. DLL bu tür şeylere sahip olamaz.

DLL'leri kullanmanın avantajları

Koda ve kaynaklara dinamik bağlama, statik bağlamaya göre çeşitli avantajlar sunar:

  • Dinamik bağlama bellek tasarrufu sağlar ve değiştirme işlemini azaltır. Birçok işlem bir DLL'yi aynı anda kullanabilir ve dll'nin bellekteki salt okunur bölümlerinin tek bir kopyasını paylaşır. Buna karşılık, statik olarak bağlı bir kitaplık kullanılarak oluşturulan her uygulama, Windows'un belleğe yüklemesi gereken kitaplık kodunun tam bir kopyasına sahiptir.

  • Dinamik bağlantı, disk alanından ve bant genişliğinden tasarruf sağlar. Birçok uygulama diskte DLL'nin tek bir kopyasını paylaşabilir. Buna karşılık, statik bağlantı kitaplığı kullanılarak oluşturulan her uygulamanın yürütülebilir görüntüsüne bağlı kitaplık kodu vardır. Bu, daha fazla disk alanı kullanır ve aktarım için daha fazla bant genişliği alır.

  • Bakım, güvenlik düzeltmeleri ve yükseltmeler daha kolay olabilir. Uygulamalarınız DLL'de yaygın işlevleri kullandığında, hata düzeltmeleri uygulayabilir ve DLL'ye güncelleştirmeleri dağıtabilirsiniz. DLL'ler güncelleştirildiğinde, bunları kullanan uygulamaların yeniden derlenmesi veya yeniden bağlanmaları gerekmez. Dağıtılır dağıtılmaz yeni DLL'yi kullanabilirler. Buna karşılık, statik olarak bağlı nesne kodunda düzeltmeler yaptığınızda, bunu kullanan her uygulamayı yeniden bağlamanız ve yeniden dağıtmanız gerekir.

  • Pazar sonrası destek sağlamak için DLL'leri kullanabilirsiniz. Örneğin, bir görüntü sürücüsü DLL'i, uygulama gönderildiğinde kullanılamamış bir görüntüyü destekleyecek şekilde değiştirilebilir.

  • Dll'leri çalışma zamanında bulmak ve yüklemek için açık bağlamayı kullanabilirsiniz. Örneğin, yeniden oluşturmadan veya yeniden dağıtmadan uygulamanıza yeni işlevler ekleyen uygulama uzantıları.

  • Dinamik bağlama, farklı programlama dillerinde yazılmış uygulamaları desteklemeyi kolaylaştırır. Programlar işlevin çağırma kuralına uygun olduğu sürece farklı programlama dillerinde yazılmış programlar aynı DLL işlevini çağırabilir. Programlar ve DLL işlevi aşağıdaki yollarla uyumlu olmalıdır: İşlevin bağımsız değişkenlerinin yığına gönderilmesini beklediği sıra. yığının temizlenmesinden işlevin veya uygulamanın sorumlu olup olmadığı. Ayrıca, herhangi bir bağımsız değişkenin yazmaçlara geçirilip geçirilmediği.

  • Dinamik bağlama, Microsoft Foundation Sınıf kitaplığı (MFC) sınıflarını genişletmek için bir mekanizma sağlar. Mevcut MFC sınıflarından sınıflar türetebilir ve bunları MFC uygulamaları tarafından kullanılmak üzere bir MFC uzantısı DLL'sine yerleştirebilirsiniz.

  • Dinamik bağlama, uygulamanızın uluslararası sürümlerinin oluşturulmasını kolaylaştırır. DLL'ler, yerel ayara özgü kaynaklar sağlamanın kullanışlı bir yoludur ve bu da bir uygulamanın uluslararası sürümlerini oluşturmayı çok daha kolay hale getirir. Uygulamanızın birçok yerelleştirilmiş sürümünü göndermek yerine, her dil için dizeleri ve görüntüleri ayrı bir kaynak DLL'sine yerleştirebilirsiniz. Ardından uygulamanız çalışma zamanında bu yerel ayar için uygun kaynakları yükleyebilir.

DLL'leri kullanmanın olası bir dezavantajı, uygulamanın kendi içinde bulunmamış olmasıdır. Ayrı bir DLL modülünün varlığına bağlıdır: yüklemenizin bir parçası olarak kendinizi dağıtmanız veya doğrulamanız gereken modül.

DLL oluşturma ve kullanma hakkında daha fazla bilgi

Aşağıdaki makaleler, Visual Studio'da C/C++ DLL'lerinin nasıl oluşturulacağı hakkında ayrıntılı bilgi sağlar.

İzlenecek yol: Dinamik bağlantı kitaplığı oluşturma ve kullanma (C++)
Visual Studio kullanarak bir DLL'nin nasıl oluşturulacağı ve kullanılacağı açıklanmıştır.

DLL Türleri
Yapılandırılabilecek farklı DLL türleri hakkında bilgi sağlar.

DLL ile ilgili sık sorulan sorular
DLL'ler hakkında sık sorulan soruların yanıtlarını sağlar.

Bir yürütülebilir dosyayı DLL’ye bağlama
DLL'ye olan açık ve örtük bağlantıları açıklar.

DLL başlatma
DLL'niz yüklendiğinde yürütülmesi gereken DLL başlatma kodunu açıklar.

DLL’ler ve Visual C++ çalışma zamanı kitaplığı davranışı
Çalışma zamanı kitaplığı DLL başlatma sırasını açıklar.

LoadLibrary ve AfxLoadLibrary
Çalışma zamanında bir DLL'ye açıkça bağlanmak için ve AfxLoadLibrary kullanmayı LoadLibrary açıklar.

GetProcAddress
DLL'de dışarı aktarılan bir işlevin adresini almak için kullanmayı GetProcAddress açıklar.

FreeLibrary ve AfxFreeLibrary
DLL modülünün artık gerekli olmadığı ve ne zaman kullanılıp FreeLibrary AfxFreeLibrary kullanılmadığını açıklar.

Dinamik Bağlantı Kitaplığı Arama Sırası
Windows işletim sisteminin sistemdeki bir DLL'yi bulmak için kullandığı arama yolunu açıklar.

MFC'ye dinamik olarak bağlı normal bir MFC DLL'sinin modül durumları
MFC'ye dinamik olarak bağlı normal bir MFC DLL'sinin modül durumlarını açıklar.

MFC uzantısı DLL’leri
Genellikle mevcut MFC sınıflarından türetilen yeniden kullanılabilir sınıfları uygulayan DLL'leri açıklar.

Yalnızca kaynak DLL'i oluşturma
Simgeler, bit eşlemler, dizeler ve iletişim kutuları gibi kaynakları içeren yalnızca kaynak DLL'sini açıklar.

MFC Uygulamalarında yerelleştirilmiş kaynaklar: Uydu DLL'leri
Uydu DLL'lere gelişmiş destek, çoklu dillerde yerelleşmiş uygulamalar oluşturmaya yardım eden bir özellik sağlar.

İçeri ve dışarı aktarma
Bir uygulamaya genel simgelerin nasıl içe aktarılacağını veya işlevlerin DLL'den nasıl dışa aktarılacağını açıklar

Etkin teknoloji ve DLL'ler
Nesne sunucularının bir DLL içinde uygulanmasına izin verir.

DLL'de Otomasyon
MFC DLL Sihirbazı'ndaki Otomasyon seçeneğinin ne sağladığını açıklar.

MFC DLL'leri için adlandırma kuralları
MFC'de bulunan DLL dosyalarının ve kitaplıkların nasıl bir yapılandırılmış adlandırma kuralı izlediğini açıklar.

Visual Basic uygulamalarından DLL işlevlerini çağırma
Visual Basic uygulamalarından DLL işlevlerinin nasıl çağrılacağını açıklar.

DLL'nin parçası olarak MFC kullanma
Windows dinamik bağlantı kitaplığının parçası olarak MFC kitaplığını kullanmanıza olanak tanıyan normal MFC DLL'lerini açıklar.

MFC'nin DLL sürümü
MFC uygulamaları ve MFC uzantısı DLL'leri ile MFCxx.dll ve MFCxxD.dll (burada x MFC sürüm numarasıdır) paylaşılan dinamik bağlantı kitaplıklarını nasıl kullanabileceğinizi açıklar.