DEF Dosyaları Kullanarak DLL'den Dışarı 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ışarı aktarmak 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çeri aktarma kitaplığına yerleştirir.
EXPORTS deyimi DLL tarafından dışarı 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ışarı aktardığı işlev sayısı olan N arasında olmalıdır. İşlevleri sıraya göre dışarı aktarmak istiyorsanız bu konuyla bitlikte, bkz. DLL'den İşlevleri İsim Yerine Sıraya Göre Dışarı 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ışarı 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ışarı aktarıyorsanız, ya düzenlenmiş isimleri .def dosyasına yerleştirmelisiniz ya da dışarı 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ışarı 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ışarı aktarıyorsanız, aşağıdaki kodu dışarı 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ışarı aktarılacağını (veya içeri 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ışarı aktarma (.exp) dosyası ve içeri aktarma kitaplık (.lib) dosyası oluşturmak için .def dosyası kullanır. Bağlayıcı sonra DLL'i oluşturmak için dışarı aktarma dosyasını kullanır. DLL'e dolaylı olarak bağlanan çalıştırılabilirler oluşturulduklarında içeri aktarma kitaplığına bağlanır.
MFC'nin, MFCx0.dll'den işlevleri ve sınıfları dışarı aktarmak için .def dosyası kullandığını unutmayın.
Ne yapmak istiyorsunuz?
C dili çalıştırılabilirlerinde kullanmak için C++ işlevlerini dışarı aktarma
C veya C++ dili çalıştırılabilirlerinde kullanmak için C işlevlerini dışarı aktarma
__declspec(dllimport) kullanarak bir uygulamaya içeri aktarma