Exportieren aus einer DLL mithilfe von DEF-Dateien

Eine Moduldefinitionsdatei oder DEF-Datei (*.def) ist eine Textdatei mit einer oder mehreren Modulanweisungen, die verschiedene Attribute einer DLL beschreiben. Wenn Sie für das Exportieren von DLL-Funktionen nicht das __declspec(dllexport)-Schlüsselwort verwenden, ist eine DEF-Datei für die DLL erforderlich.

Eine DEF-Datei muss mindestens die folgenden Moduldefinitionsanweisungen enthalten:

  • Die erste Anweisung in der Datei muss die nullLIBRARYnull-Anweisung sein. Sie kennzeichnet die Zugehörigkeit der DEF-Datei zu einer DLL. Auf die nullLIBRARYnull-Anweisung folgt der Name der DLL. Der Linker speichert diesen Namen in der Importbibliothek der DLL.

  • Durch die nullEXPORTSnull-Anweisung werden die Namen und optional die Ordinalwerte der von der DLL exportierten Funktionen aufgelistet. Sie weisen der Funktion einen Ordinalwert zu, indem Sie dem Funktionsnamen ein @-Zeichen und eine Zahl nachstellen. Die Ordinalzahlen müssen sich in einem Bereich von 1 bis N befinden, wobei N die Gesamtzahl der von der DLL exportierten Funktionen angibt. Informationen zum Exportieren von Funktionen anhand der Ordnungszahl finden Sie unter diesem Thema sowie unter Exportieren von Funktionen aus einer DLL über die Ordnungszahl statt über den Namen.

Die DEF-Datei für eine DLL, die den Code für die Implementierung einer binären Suchstruktur enthält, könnte z. B. folgendermaßen aussehen:

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

Wenn Sie zum Erstellen einer MFC-DLL den MFC-DLL-Assistenten verwenden, erstellt der Assistent eine DEF-Gerüstdatei und fügt sie automatisch dem Projekt hinzu. Fügen Sie die Namen der zu exportierenden Funktionen in diese Datei ein. Für MFC-fremde DLLs müssen Sie die DEF-Datei selbst erstellen und dem Projekt hinzufügen. Navigieren Sie dann zu Projekt>Eigenschaften>Linker>Eingabe>Moduldefinitionsdatei, und geben Sie den Namen der DEF-Datei ein. Wiederholen Sie diesen Schritt für jede Konfiguration und Plattform, oder führen Sie alles gleichzeitig aus, indem Sie Konfiguration = Alle Konfigurationen und Plattform = Alle Plattformen auswählen.

Wenn Sie Funktionen in eine C++-Datei exportieren, müssen Sie entweder die dekorierten Namen in die DEF-Datei einfügen oder die exportierten Funktionen unter Verwendung von extern „C“ mit der standardmäßigen C-Bindung definieren. Wenn Sie die dekorierten Namen in der DEF-Datei angeben müssen, können Sie diese mithilfe des Tools DUMPBIN oder mit der /MAP-Linkeroption abrufen. Beachten Sie, dass die vom Compiler erzeugten, ergänzten Namen compilerspezifisch sind. Wenn Sie die vom Microsoft C++-Compiler (MSVC) erzeugten, dekorierten Namen in eine DEF-Datei einfügen, ist es erforderlich, dass Anwendungen, die mit der DLL verknüpft werden, mit derselben Version von MSVC erstellt wurden. Auf diese Weise wird gewährleistet, dass die ergänzten Namen in der aufrufenden Anwendung mit den exportierten Namen in der DEF-Datei der DLL übereinstimmen.

Hinweis

Eine mit Visual Studio 2015 erstellte DLL kann von Anwendungen verwendet werden, die mit Visual Studio 2017 oder Visual Studio 2019 erstellt wurden.

Wenn Sie eine Erweiterungs-DLL erstellen und den Export über eine DEF-Datei vornehmen, fügen Sie den folgenden Code am Anfang und am Ende der Headerdateien ein, in denen die exportierten Klassen enthalten sind:

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

Diese Zeilen stellen sicher, dass MFC-Variablen, die intern verwendet bzw. Klassen hinzugefügt werden, von der Erweiterungs-MFC-DLL exportiert (bzw. importiert) werden. Wenn Sie z. B. eine Klasse mithilfe von DECLARE_DYNAMIC ableiten, wird das Makro erweitert und Ihrer Klasse wird eine Membervariable CRuntimeClass hinzugefügt. Ohne diese vier Zeilen wird die DLL u. U. nicht einwandfrei kompiliert bzw. verknüpft, oder es tritt ein Fehler auf, wenn die Clientanwendung mit der DLL verknüpft wird.

Der Linker verwendet beim Erstellen der DLL die DEF-Datei, um eine Exportdatei (.exp) und eine Importbibliothek (.lib) zu erstellen. Anschließend verwendet der Linker die Exportdatei zum Erstellen der DLL-Datei. Ausführbare, implizit mit der DLL verknüpfte Dateien werden bei ihrer Erstellung mit der Importbibliothek verknüpft.

Beachten Sie, dass MFC selbst die DEF-Dateien verwendet, um Funktionen und Klassen aus MFCx0.dll zu exportieren.

Wie möchten Sie vorgehen?

Worüber möchten Sie mehr erfahren?

Siehe auch

Exportieren aus einer DLL