Hangi Dışarı Aktarma Yönteminin Kullanılacağını Belirleme
İşlevleri iki yoldan biriyle dışarı aktarabilirsiniz: .def dosyası veya __declspec(dllexport)
anahtar sözcüğü. DLL'niz için hangi yolun daha iyi olduğuna karar vermenize yardımcı olmak için şu soruları göz önünde bulundurun:
Daha sonra daha fazla işlevi dışarı aktarmayı planlıyor musunuz?
DLL'niz yalnızca yeniden oluşturabileceğiniz uygulamalar tarafından mı kullanılıyor yoksa yeniden oluşturamadığınız uygulamalar mı (örneğin, üçüncü taraflar tarafından oluşturulan uygulamalar) tarafından mı kullanılıyor?
.def Dosyalarını Kullanmanın Avantajları ve Dezavantajları
İşlevleri bir .def dosyasında dışarı aktarmak, dışarı aktarma sıraları üzerinde denetim sahibi olmanıza neden oluyor. DLL'nize dışarı aktarılan bir işlev eklediğinizde, dışarı aktarılan diğer işlevlerden daha yüksek bir sıra değeri atayabilirsiniz. Bunu yaptığınızda, örtük bağlama kullanan uygulamaların yeni işlevi içeren içeri aktarma kitaplığıyla yeniden bağlantısı olması gerekmez. Birçok uygulama tarafından kullanılmak üzere bir DLL tasarlarsanız, bu çok kullanışlıdır çünkü yeni işlevler ekleyebilir ve zaten buna bağlı olan uygulamalarla düzgün çalışmaya devam ettiğinden emin olabilirsiniz. Örneğin, MFC DLL'leri .def dosyaları kullanılarak oluşturulur.
.def dosyası kullanmanın bir diğer avantajı, bir işlevi dışarı aktarmak için özniteliğini NONAME
kullanabilmenizdir. Bu, DLL'deki dışarı aktarmalar tablosuna yalnızca sırayı yerleştirir. Çok sayıda dışarı aktarılan işleve sahip DLL'ler için özniteliğini NONAME
kullanmak DLL dosyasının boyutunu küçültebilir. Modül tanımı deyimi yazma hakkında bilgi için bkz . Module-Definition Deyimleri Için Kurallar. Sıralı dışarı aktarma hakkında bilgi için bkz . İşlevleri Bir DLL'den Ada Göre Değil Sıralı Olarak Dışarı Aktarma.
.def dosyası kullanmanın bir dezavantajı, işlevleri bir C++ dosyasında dışarı aktarıyorsanız, .def dosyasına süslü adları koymanız veya MSVC derleyicisi tarafından yapılan ad düzenlemesini önlemek için extern "C" kullanarak dışarı aktarılan işlevleri tanımlamanız gerekmesidir.
Süslü adları .def dosyasına koyarsanız, DUMPBIN aracını veya bağlayıcı /MAP seçeneğini kullanarak bunları alabilirsiniz. Derleyici tarafından üretilen süslü adlar derleyiciye özgü; bu nedenle, derleyici tarafından üretilen süslü adları bir .def dosyasına koyarsanız, DLL'ye bağlanan uygulamalar da çağıran uygulamadaki süslü adların DLL'nin .def dosyasındaki dışarı aktarılan adlarla eşleşmesi için derleyicinin aynı sürümü kullanılarak derlenmelidir.
__declspec Kullanmanın Avantajları ve Dezavantajları (dllexport)
Bir __declspec(dllexport)
.def dosyasının bakımını yapma ve dışarı aktarılan işlevlerin süslü adlarını alma konusunda endişelenmeniz gerekmediğinden kullanmak kullanışlıdır. Ancak, bu dışarı aktarma yolunun kullanışlılığı, yeniden derlemek istediğiniz bağlı uygulama sayısıyla sınırlıdır. DLL'yi yeni dışarı aktarmalarla yeniden oluşturursanız, dışarı aktarılan C++ işlevleri için düzenlenmiş adlar yeniden derlemek için derleyicinin farklı bir sürümünü kullanırsanız değişebileceğinden uygulamaları da yeniden oluşturmanız gerekir.
Ne yapmak istiyorsunuz?
C dili yürütülebilir dosyalarda kullanmak üzere C++ işlevlerini dışarı aktarma
C veya C++dil yürütülebilir dosyalarında kullanmak üzere C işlevlerini dışarı aktarma