Aracılığıyla paylaş


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

Modül tanımı veya DEF dosyası (*.def), DLL'nin çeşitli özniteliklerini açıklayan bir veya daha fazla modül deyimi içeren bir metin dosyasıdır. DLL'nin işlevlerini dışarı aktarmak için anahtar sözcüğünü __declspec(dllexport) kullanmıyorsanız, DLL bir DEF dosyası gerektirir.

En düşük DEF dosyası aşağıdaki modül tanımı deyimlerini içermelidir:

  • Dosyadaki ilk deyim LIBRARY deyimi olmalıdır. Bu deyim, DEF dosyasını bir DLL'ye ait olarak tanımlar. LIBRARY deyiminin ardından DLL'nin adı eklenir. Bağlayıcı bu adı DLL'nin içeri aktarma kitaplığına yerleştirir.

  • EXPORTS deyimi, DLL tarafından dışarı aktarılan işlevlerin adlarını ve isteğe bağlı olarak sıra değerlerini listeler. İşlevin adını at işareti (@) ve bir sayı ile izleyerek işleve bir sıra değeri atarsınız. Sıra değerlerini belirttiğinizde, bunların 1 ile N aralığında olması gerekir; burada N, DLL tarafından dışarı aktarılan işlevlerin sayısıdır. İşlevleri sıralı olarak dışarı aktarmak istiyorsanız, bu konunun yanı sıra Ad Yerine Sıralı Bir DLL'den İşlevleri Dışarı Aktarma konusuna bakın.

Örneğin, ikili arama ağacı uygulama kodunu içeren bir DLL aşağıdaki gibi görünebilir:

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

MFC DLL Sihirbazı'nı kullanarak bir MFC DLL oluşturursanız, sihirbaz sizin için bir iskelet DEF dosyası oluşturur ve bunu projenize otomatik olarak ekler. Bu dosyaya dışarı aktarılacak işlevlerin adlarını ekleyin. MFC olmayan DLL'ler için DEF dosyasını kendiniz oluşturun ve projenize ekleyin. Ardından Proje>Özellikleri>Bağlayıcı>Giriş>Modülü Tanım Dosyası'na gidin ve DEF dosyasının adını girin. Her yapılandırma ve platform için bu adımı yineleyin veya Yapılandırma = Tüm Yapılandırmalar ve Platform = Tüm Platformlar'ı seçerek hepsini bir kerede yapın.

İşlevleri bir C++ dosyasında dışarı aktarıyorsanız, süslü adları DEF dosyasına yerleştirmeniz veya dışarı aktarılan işlevlerinizi extern "C" kullanarak standart C bağlantısıyla tanımlamanız gerekir. Dekore edilmiş adları DEF dosyasına yerleştirmeniz gerekiyorsa, DUMPBIN aracını veya bağlayıcı /MAP seçeneğini kullanarak bunları alabilirsiniz. Derleyici tarafından üretilen süslü adların derleyiciye özgü olduğunu unutmayın. Microsoft C++ derleyicisi (MSVC) tarafından üretilen süslü adları bir DEF dosyasına yerleştirirseniz, DLL'nize 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 aynı MSVC sürümü kullanılarak derlenmelidir.

Dekont

Visual Studio 2015 ile oluşturulan bir DLL, Visual Studio 2017 veya Visual Studio 2019 ile oluşturulan uygulamalar tarafından kullanılabilir.

Uzantı DLL'sini oluşturuyor ve DEF dosyası kullanarak dışarı aktarıyorsanız, dışarı aktarılan sınıfları içeren üst bilgi dosyalarınızın başına ve sonuna aşağıdaki kodu yerleştirin:

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

Bu satırlar, dahili olarak kullanılan veya sınıflarınıza eklenen MFC değişkenlerinin MFC uzantı DLL'nizden dışarı aktarılmasını (veya içeri aktarılmasını) sağlar. Örneğin, kullanarak DECLARE_DYNAMICbir sınıf türetilirken makro, sınıfınıza üye CRuntimeClass değişkeni eklemek için genişletilir. Bu dört satırın dışında bırakılması DLL'nizin yanlış derlenip bağlanmasına veya istemci uygulaması DLL'ye bağlandığında hataya neden olabilir.

DLL'yi oluştururken bağlayıcı, dışarı aktarma (.exp) dosyası ve içeri aktarma kitaplığı (.lib) dosyası oluşturmak için DEF dosyasını kullanır. Bağlayıcı daha sonra DLL dosyasını oluşturmak için dışarı aktarma dosyasını kullanır. Dll'ye örtük olarak bağlanan yürütülebilir dosyalar, 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 dosyalarını kullandığını unutmayın.

Ne yapmak istiyorsunuz?

Ne hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

DLL'den Dışarı Aktarma