Aracılığıyla paylaş


DEF Dosyaları Kullanarak DLL'den Dışa Aktarma

Modül tanım (.def) dosyası, DLL'in çeşitli özniteliklerini tanımlayan bir veya daha fazla modül deyimi içerir. DLL işlevlerini dışa aktarma için __declspec(dllexport) anahtar sözcüğünü kullanmıyorsanız, DLL .def dosyası gerektirir.

.def dosyası en az aşağıdaki modül tanımlama deyimlerini içermelidir:

  • Dosyadaki ilk deyim LIBRARY deyimi olmalıdır. Bu ifade dosyanın DLL'e ait olduğunu belirtir. LIBRARY deyimini DLL'in adı izler. Bağlayıcı, bu adı DLL'in içe aktarma kitaplığına yerleştirir.

  • EXPORTS deyimi DLL tarafından dışa aktarılan işlevlerin isimlerini ve isteğe bağlı olarak sıralı değerlerini listeler. İşleve sıralı değeri, işlevin adının sonuna '-de' işareti (@) ve sayı koyarak atarsınız. Sıralı değerleri belirttiğinizde, değerler 1 ile DLL'in dışa aktardığı işlev sayısı olan N arasında olmalıdır. İşlevleri sıraya göre dışa aktarmak istiyorsanız bu konuyla bitlikte, bkz. DLL'den İşlevleri İsim Yerine Sıraya Göre Dışa Aktarma.

Örneğin, ikili arama ağacını uygulayan kod içeren bir DLL aşağıdakine benzeyebilir:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Eğer MFC DLL'i oluşturmak için MFC DLL Sihirbazı'nı kullanırsanız, sihirbaz sizin için iskelet .def dosyasını oluşturur ve otomatik olarak projenize ekler. Dışa aktarılacak olan işlevlerin adını bu dosyaya ekleyin. MFC dışı DLL'ler için, .def dosyasını kendiniz oluşturmalı ve projenize eklemelisiniz.

Eğer işlevlerinizi C++ dosyasına dışa aktarıyorsanız, ya düzenlenmiş isimleri .def dosyasına yerleştirmelisiniz ya da dışa aktarılan işlevlerinizi dış "C" kullanarak standart C bağlantısıyla tanımlayın. Düzenlenmiş adları .def dosyasına yerleştirmeniz gerekirse, DUMPBIN aracını veya /MAP bağlayıcı seçeneğini kullanarak adları alabilirsiniz. Derleyici tarafından üretilen düzenlenmiş adların derleyiciye özel olduğunu unutmayınız. Visual C++ derleyicisi tarafından üretilen düzenlenmiş adları .def dosyasına yerleştirirseniz, çağıran uygulamadaki düzenlenmiş adlarla DLL'in .def dosyasındaki dışa aktarılan adların eşleşmesi için DLL'inize bağlanan uygulamaların aynı Visual C++ sürümüyle oluşturulması gerekir.

Eğer uzantı DLL oluşturuyorsanız ve .def dosyası kullanarak dışa aktarıyorsanız, aşağıdaki kodu dışa aktarılan sınıfları içeren başlık dosyalarının başına ve sonuna koyunuz:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Bu satırlar, içerde kullanılan veya sınıfınıza eklenen MFC değişkenlerinin sizin uzantı DLL'iniden dışa aktarılacağını (veya içe aktarılacağını) garanti eder. Örneğin, DECLARE_DYNAMIC kullanarak sınıf türetirken, sınıfınıza CRuntimeClass üye değişkeni eklemek için makro genişler. Bu dört satırı bırakmak DLL'inizin yanlış şekilde derlenmesine veya bağlanmasına hatta istemci uygulama, DLL'inize bağlandığında hatalara yol açabilir.

DLL'i oluştururken, bağlayıcı dışa aktarma (.exp) dosyası ve içe aktarma kitaplık (.lib) dosyası oluşturmak için .def dosyası kullanır. Bağlayıcı sonra DLL'i oluşturmak için dışa aktarma dosyasını kullanır. DLL'e dolaylı olarak bağlanan çalıştırılabilirler oluşturulduklarında içe aktarma kitaplığına bağlanır.

MFC'nin, MFCx0.dll'den işlevleri ve sınıfları dışa aktarmak için .def dosyası kullandığını unutmayın.

Ne yapmak istiyorsunuz?

Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Kavramlar

DLL'den Dışa Aktarma