Freigeben über


Bestimmen der geeigneten Exportmethode

Sie können Funktionen in jedem der zwei Methoden-ein .def oder des Schlüsselworts __declspec(dllexport) exportieren. Zur Verbesserung zu entscheiden welche Methode für die DLL besser ist, sollten Sie folgende Fragen:

  • Planen, mehr später Funktionen zu exportieren?

  • Wird die DLL nur von Anwendungen, die neu erstellen können, oder wird die Verwendung von Anwendungen, dass Sie nicht REBUILD-für Beispiel können, Anwendungen verwendet, die von Drittanbietern erstellt werden?

Vor- und Nachteile der Verwendung von DEF-Dateien

Das Exportieren von Funktionen in einer DEF-Datei gibt Ihnen Kontrolle über den Exportordnungszahlen. Wenn Sie eine exportierte Funktion der DLL hinzufügen, können Sie ihr einen höheren Wert als jede andere exportierte Funktion zuweisen. Wenn Sie dies durchführen, müssen Anwendungen, die die implizite Verknüpfung verwenden, nicht mit der Importbibliothek erneut binden, die die neue Funktion. Dies ist sehr praktisch, wenn Sie eine DLL für viele Anwendungen entwerfen, da Sie neue Funktionen hinzufügen und außerdem sicherstellen können, dass sie fortgesetzt wird, um mit Anwendungen ordnungsgemäß funktionieren, die bereits auf sie basieren. Beispielsweise werden die MFC-DLLs erstellt, indem die DEF-Dateien verwendet.

Ein anderer Vorteil der Verwendung einer DEF-Datei besteht darin, dass Sie das NONAME-Attribut verwenden können, um eine Funktion zu exportieren. Dadurch wird nur der Ordinalwert in der Exporttabelle der DLL ein. Bei DLLs, die zahlreiche exportierte Funktionen haben, mithilfe des NONAME-Attributs kann die Größe der DLL-Datei reduzieren. Informationen dazu, wie einer Moduldefinitionsanweisung, finden Sie unter Regeln für Moduldefinitionsanweisungen. Informationen zum Ordnungsexport, finden Sie unter Exportieren von Funktionen aus einer DLL über die Ordnungszahl statt über den Namen.

Ein Nachteil bei Verwendung einer DEF-Datei besteht darin, dass, wenn Sie Funktionen in eine C++-Datei exportieren, Sie entweder die ergänzten Namen in die DEF-Datei einfügen oder die exportierten Funktionen definieren müssen, indem Sie extern "C" verwenden, um die Namensergänzung zu vermeiden, die vom Visual C++-Compiler vorgenommen wird.

Wenn Sie sich stellen, die ergänzten Namen in die DEF-Datei, können Sie erhalten, indem Sie das Tool DUMPBIN verwenden oder die /MAP Linker Option verwenden. Die ergänzten Namen, die vom Compiler erzeugten, compilerspezifisch sind; daher Sie die ergänzten Namen stellen, die vom Compiler in eine DEF-Datei erzeugt wurden, müssen die Anwendungen, die mit der DLL verknüpft werden, auch erstellt werden, indem die gleiche Version des Compilers dass die ergänzten Namen in der aufrufenden Anwendungs-Abgleichung die exportierten Namen in der DEF-Datei der DLL verwendet.

Gründe für und gegen die Verwendung von "__declspec(dllexport)"

Mit __declspec(dllexport) ist äußerst bequem, da weder eine DEF-Datei bereitgestellt noch die ergänzten Namen exportierter Funktionen ermittelt werden müssen. Allerdings wird die Nützlichkeit dieser Methode des Exportierens von der Anzahl verknüpfter Anwendungen begrenzt, dass Sie bereit sind neu zu erstellen. Wenn Sie die DLL mit neuen Exporten neu erstellen, müssen die Anwendungen auch neu erstellen, da die ergänzten Namen für exportierte C++-Funktionen sich ändern können, wenn Sie eine andere Version des Compilers verwenden, um es neu zu erstellen.

Was möchten Sie tun?

Worüber möchten Sie mehr erfahren?

Siehe auch

Konzepte

Exportieren aus einer DLL