Bestimmen der geeigneten Exportmethode
Um zu entscheiden, welche Methode für den Export von Funktionen verwendet werden soll (DEF-Datei oder __declspec(dllexport)-Schlüsselwort), beantworten Sie folgende Fragen:
Müssen weitere exportierte Funktionen hinzugefügt werden?
Wer verwendet Ihre DLL? Handelt es sich z. B. um eine DLL eines anderen Herstellers, die von vielen ausführbaren Dateien verwendet wird, die nicht neu erstellt werden können, oder wird die DLL nur von Anwendungen verwendet, die Sie problemlos neu erstellen können?
Gründe für und gegen die Verwendung von DEF-Dateien
Beim Exportieren von Funktionen über eine DEF-Datei haben Sie die Kontrolle über die Exportordinalzahlen. Wenn Sie der DLL weitere exportierte Funktionen hinzufügen, können Sie ihnen höhere Ordinalwerte zuweisen (die über denen anderer exportierter Funktionen liegen). In diesem Fall müssen Anwendungen mit impliziter Verknüpfung nicht erneut mit der neuen Importbibliothek verknüpft werden, in der die neuen Funktionen enthalten sind. Dieser Aspekt ist z. B. von Bedeutung, wenn Sie eine DLL eines anderen Anbieters entwerfen, die von zahlreichen Anwendungen genutzt werden soll. Sie können Ihre DLL durch zusätzliche Funktionen ständig weiterentwickeln, während Sie gleichzeitig sicherstellen, dass bestehende Anwendungen ordnungsgemäß mit der neuen DLL ausgeführt werden. MFC-DLLs werden unter Verwendung von DEF-Dateien erstellt.
Ein weiterer Vorteil bei der Verwendung von DEF-Dateien besteht darin, dass Funktionen mit dem NONAME-Attribut exportiert werden können, wodurch nur der Ordinalwert in der Exporttabelle der DLL abgelegt wird. Bei DLLs mit einer Vielzahl exportierter Funktionen kann die Größe der DLL-Datei durch die Verwendung des NONAME-Attributs verringert werden. Informationen über das Schreiben einer Moduldefinitionsanweisung finden Sie unter Regeln für Moduldefinitionsanweisungen. Weitere Informationen zum Exportieren mit Ordinalzahlen finden Sie unter Exportieren von Funktionen aus einer DLL über die Ordnungszahl statt über den Namen.
Der größte Nachteil bei Verwendung einer DEF-Datei besteht darin, dass beim Export von Funktionen in eine C++-Datei entweder die ergänzten Namen in die DEF-Datei eingefügt oder die exportierten Funktionen unter Verwendung von extern "C" mit der standardmäßigen C-Bindung definiert werden müssen, damit keine Namen vom Compiler ergänzt werden.
Wenn Sie die ergänzten 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 Visual C++-Compiler erzeugten, ergänzten Namen in eine DEF-Datei einfügen, ist es erforderlich, dass Anwendungen, die mit der DLL verknüpft werden, mit derselben Version von Visual C++ erstellt wurden. Auf diese Weise ist gewährleistet, dass die ergänzten Namen in der aufrufenden Anwendung mit den exportierten Namen in der DEF-Datei der DLL übereinstimmen.
Gründe für und gegen die Verwendung von "__declspec(dllexport)"
Die Verwendung von __declspec(dllexport) ist äußerst bequem, da weder eine DEF-Datei bereitgestellt noch die ergänzten Namen exportierter Funktionen ermittelt werden müssen. Diese Methode ist beispielsweise geeignet, wenn Sie eine DLL erstellen, die für eine von Ihnen gesteuerte Anwendung verwendet wird. Wenn Sie die DLL mit neuen Exporten neu erstellen, muss auch die Anwendung neu erstellt werden, da die ergänzten Namen für exportierte C++-Funktionen sich ändern können, wenn Sie mit einer anderen Version des Compilers neu kompilieren.
Was möchten Sie tun?
Exportieren aus einer DLL mithilfe von __declspec(dllexport)
Exportieren von C++-Funktionen zur Verwendung in ausführbaren C-Dateien
Exportieren von C-Funktionen zur Verwendung in ausführbaren C- oder C++-Dateien
Importieren in eine Anwendung mithilfe von __declspec(dllimport)