Verwenden des dllimport und des dllexport in C++-Klassen

Microsoft-spezifisch

Sie können dllimport oder C++-Klassen mit dem dllexport-Attribut deklarieren.Diese Formen bedeutet, dass die gesamte Klasse importiert oder exportiert wird.exportierten Klassen auf diese Weise exportierbare Klassen aufgerufen werden.

Im folgenden Beispiel wird eine exportierbare Klasse.Alle deren Memberfunktionen und statischen Daten exportiert werden:

#define DllExport   __declspec( dllexport )

class DllExport C {
   int i;
   virtual int func( void ) { return 1; }
};

Beachten Sie, dass explizit für dllimport und verwenden Sie dllexport-Attribute auf Member einer Klasse exportfähigen verhindert wird.

dllexport Klassen

Wenn Sie eine Klasse dllexportdeklarieren, werden alle zugeordneten Memberfunktionen und statischer Datenmember exportiert.Sie müssen die Definitionen all dieser Member im selben Programm bereitstellen.Andernfalls wird ein Linkerfehler generiert.Die eine Ausnahme von dieser Regel gilt für rein virtuelle Funktionen, für die Sie müssen keine expliziten Definitionen bereitzustellen.Da ein Destruktor für eine abstrakte Klasse immer durch den Destruktor für die Basisklasse aufgerufen wird, müssen rein virtuellen Destruktoren eine Definition immer bereitstellen.Beachten Sie, dass diese Regeln identisch für nonexportable Klassen sind.

Wenn Sie Daten des Klassentyps oder Funktionen exportieren, die sicher sind, Klassen, die Klasse zu exportieren.

dllimport Klassen

Wenn Sie eine Klasse dllimportdeklarieren, werden alle zugeordneten Memberfunktionen und statischer Datenmember importiert.Im Gegensatz zum Verhalten von dllimport und dllexport auf Nicht-Klassen-Typen eine statische Datenmember können nicht im selben Programm nicht angeben, in dem eine dllimport-Klasse definiert ist.

exportierbare Klassen und Vererbung

Alle Basisklassen exportierbare Klasse müssen exportierbar sein.Wenn dies nicht der Fall ist, wird eine Compilerwarnung ausgegeben.Darüber hinaus müssen alle verfügbaren Member, die auch Klassen sind exportierbar sein.Diese Regel ermöglicht eine dllexport-Klasse aus einer dllimport-Klasse erbt, und eine dllimport-Klasse aus einer dllexport-Klasse zu erben (auch wenn letztere nicht empfohlen wird.)In der Regel sollte alles, der dem Client der DLL zugreifen kann (gemäß C++-Zugriffsregeln) Teil der exportfähigen Schnittstelle sein.Dies schließt die privaten Datenmember, die in Inlinefunktionen verwiesen wird.

Selektiver Export/Member-Import

Da Memberfunktionen und statische Daten innerhalb einer Klasse implizit externe Bindung haben, können Sie sie mit dem dllimport oder dllexport-Attribut deklarieren, es sei denn, die gesamte Klasse exportiert wird.Wenn die gesamte Klasse importiert oder exportiert wird, wird die explizite Deklaration von Memberfunktionen und Daten als dllimport oder dllexport verhindert.Wenn Sie einen statischen Datenmember innerhalb einer Klassendefinition als dllexportdeklarieren, muss eine Definition innerhalb desselben Programms auftreten (z. B. irgendwo nonclass mit externer Bindung).

Entsprechend können Sie Memberfunktionen mit den dllimport oder dllexport-Attribute deklarieren.In diesem Fall müssen Sie eine dllexport Definition innerhalb desselben Programms irgendwo bereitstellen.

Es ist lohnend, einige wichtige Aspekte hinsichtlich der selektiven Member import und - export zu beachten:

  • import und - export Selektiver Member wird am besten zum Bereitstellen einer Version der exportierten Klassenschnittstelle verwendet, die restriktiver ist. Das bedeutet, dass ein, für das Sie eine DLL entwerfen können, die weniger öffentliche und private Funktionen als die Sprache verfügbar macht, andernfalls unterstützen.Es kann auch zum Abstimmen der exportfähigen Schnittstelle nützlich: Wenn Sie wissen, dass der Client nicht möglich ist, einige definitionsgemäß private Daten zuzugreifen, müssen Sie nicht die gesamte Klasse exportieren.

  • Wenn Sie eine virtuelle Funktion in einer Klasse exportieren, müssen Sie alle exportieren, oder stellen Sie mindestens Versionen bereit, die der Client direkt verwenden kann.

  • Wenn Sie eine Klasse verfügen, auf der Sie selektiven Member import/- export mit virtuellen Funktionen verwenden, müssen die Funktionen in der exportfähigen Schnittstelle sein oder inline definiert () für den Client sichtbar.

  • Wenn Sie einen Member als dllexport definieren, jedoch nicht in der Klassendefinition einfügen, wird ein Compilerfehler generiert.Sie müssen den Member im Header des Klassen definieren.

  • Obwohl die Definition von Klassenmembern als dllimport oder dllexport zulässig ist, können Sie die Schnittstelle nicht überschreiben, die in der Klassendefinition angegeben wird.

  • Wenn Sie eine Memberfunktion an einem Ort außer den Text der Klassendefinition definieren, in der sie deklariert hat, wird eine Warnung ausgegeben, wenn die Funktion als dllexport oder dllimport definiert ist (wenn diese Definition von der unterscheidet, die in der Klassendeklaration angegeben wurde).

Siehe auch

Referenz

dllexport, dllimport