Exportieren aus einer DLL mithilfe von "__declspec(dllexport)"
__export wurde von Microsoft mit der 16-Bit-Compilerversion von Visual C++ eingeführt, damit der Compiler die Exportnamen automatisch generieren und in einer LIB-Datei speichern kann. Diese LIB-Datei kann dann wie eine statische LIB-Datei zur Verknüpfung mit einer DLL verwendet werden.
In neueren Compilerversionen können Sie Daten, Funktionen, Klassen oder Memberfunktionen von Klassen aus einer DLL exportieren, indem Sie das __declspec(dllexport)-Schlüsselwort verwenden. Mithilfe von __declspec(dllexport) wird der Objektdatei die Exportdirektive hinzugefügt, sodass keine DEF-Datei erforderlich ist.
Am deutlichsten zeigt sich diese einfache Handhabung beim Exportieren von ergänzten C++-Funktionsnamen. Da es keine Standardspezifikation für die Namensergänzung gibt, kann der Name einer exportierten Funktion zwischen den einzelnen Compilerversionen variieren. Bei Verwendung von __declspec(dllexport) ist die Neukompilierung der DLL und der von ihr abhängigen EXE-Dateien nur erforderlich, wenn Änderungen bei den Namenskonventionen auftreten.
Viele Exportdirektiven, z. B. Ordinalzahlen, NONAME und PRIVATE, können nur in einer DEF-Datei angegeben werden, und es gibt keine Möglichkeit, diese Attribute ohne DEF-Datei festzulegen. Die Verwendung von __declspec(dllexport) zusätzlich zu einer DEF-Datei verursacht jedoch keine Erstellungsfehler.
Zum Exportieren von Funktionen muss das __declspec(dllexport)-Schlüsselwort links neben dem Schlüsselwort für die Aufrufkonvention stehen, sofern ein Schlüsselwort angegeben wird. Beispiel:
__declspec(dllexport) void __cdecl Function1(void);
Um alle öffentlichen Datenmember und Memberfunktionen einer Klasse zu exportieren, muss das Schlüsselwort, wie im nachfolgenden Beispiel dargestellt, links vom Klassennamen erscheinen:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Hinweis
__declspec(dllexport) kann nicht mit der __clrcall-Aufrufkonvention für eine Funktion übernommen werden.
Beim Erstellen der DLL erstellen Sie in der Regel eine Headerdatei mit den Funktionsprototypen oder den zu exportierenden Klassen und fügen den Deklarationen in der Headerdatei anschließend __declspec(dllexport) hinzu. Um den Code lesbarer zu gestalten, definieren Sie ein Makro für __declspec(dllexport) und verwenden anschließend das Makro für jedes Symbol, das Sie exportieren:
#define DllExport __declspec( dllexport )
__declspec(dllexport) speichert Funktionsnamen in der Exporttabelle der DLL. Informationen dazu, wie Sie die Größe der Tabelle verringern, finden Sie unter Exportieren von Funktionen aus einer DLL über die Ordnungszahl statt über den Namen.
Hinweis
Wenn Sie DLL-Quellcode von Win16 auf Win32 portieren, ersetzen Sie jede Instanz von __export durch __declspec(dllexport).
Zu Referenzzwecken können Sie die Win32-Headerdatei Winbase.h durchsuchen. Sie enthält Verwendungsbeispiele für __declspec(dllimport).
Was möchten Sie tun?
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)