Tramite l'attributo dllimport e di dllexport nelle classi C++
Specifici di Microsoft
È possibile dichiarare le classi C++ con dllimport o dllexport attributo.Questi form suggerisce che l'intera classe sia inclusa o esportata.Le classi presentano esportato in questo modo vengono chiamate classi esportabili.
Nell'esempio seguente viene definita una classe esportabile.Tutti i relativi funzioni membro e dati statici vengono esportati:
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
Si noti che esplicito di utilizzare dllimport e dllexport gli attributi sui membri di una classe esportabile è consentito.
classi di dllexport
Quando si dichiara la classe dllexport, tutte le funzioni membro e membri dati statici vengono esportati.È necessario fornire le definizioni di tutti i tali membri nello stesso programma.In caso contrario, verrà generato un errore del linker viene generato.Ad eccezione a questa regola si applica alle funzioni virtuali pure, per il quale non è necessario fornire le definizioni esplicite.Tuttavia, un distruttore di una classe astratta viene sempre chiamato il distruttore della classe base, i distruttori virtuali pure devono fornire sempre una definizione.Si noti che queste regole valgono per le classi nonexportable.
Se si esporta dati di classe digitare o funzioni che le classi di ritorno, sono protette di esportare la classe.
classi di dllimport
Quando si dichiara la classe dllimport, tutte le funzioni membro e membri dati statici vengono inclusi.A differenza del comportamento di dllimport e dllexport i tipi di nonclass, i membri dati statici non possono specificare una definizione nello stesso programma in cui a dllimport la classe è definita.
ereditarietà e classi esportabili
Tutte le classi base di classe esportabile devono essere esportabili.In caso contrario, un avviso del compilatore viene generato.Inoltre, tutti i membri accessibili che sono classi devono essere esportabili.Questa regola consente a dllexport una classe per ereditare da un oggetto dllimport classe e a dllimport una classe per ereditare da un oggetto dllexport classe (anche se quest'ultima non è consigliabile).In generale, tutto ciò che è accessibile al client della DLL (in base alle regole di accesso C++) devono far parte dell'interfaccia esportabile.Sono inclusi i membri dati privati fatto riferimento nelle funzioni inline.
Importazione/esportazione selettive del membro
Poiché le funzioni membro e i dati statici All'interno di una classe in modo implicito dispongono di collegamento esterno, è possibile dichiararli con dllimport o dllexport attributo, a meno che l'intera classe sia esportata.Se l'intera classe è inclusa o esportata, la dichiarazione esplicita delle funzioni membro e i dati come dllimport o dllexport è consentito.Se si dichiara un membro dati statici all'interno di una definizione della classe come dllexport, una definizione deve verificarsi in con lo stesso programma (con collegamento esterno di nonclass).
Analogamente, è possibile dichiarare le funzioni membro con dllimport o dllexport attributi.In questo caso, è necessario fornire un oggetto dllexport la definizione posizionato all'interno dello stesso programma.
Sarà interessante notare diversi aspetti importanti per quanto riguarda l'importazione e l'esportazione selettive il membro:
L'importazione/esportazione selettive del membro viene utilizzata più adatto per fornire la versione dell'interfaccia della classe esportata che è più restrittiva; ovvero uno per il quale è possibile progettare una DLL che espone meno il pubblico e le funzionalità private dal linguaggio concederebbe in caso contrario.È utile anche per ottimizzare l'interfaccia esportabile: quando si sa che il client, per definizione, non può accedere ai dati privati, non è necessario esportare l'intera classe.
Se si esporta una funzione virtuale in una classe, è necessario esportare tutti, o fornire almeno le versioni che il client può utilizzare direttamente.
Se si dispone di una classe in cui si utilizza l'importazione/esportazione selettive del membro con funzioni virtuali, è necessario che le funzioni nell'interfaccia esportabile o in definito inline (visibile al client).
Se si definisce un membro come dllexport ma non includerlo nella definizione della classe, un errore del compilatore viene generato.È necessario definire il membro nell'intestazione della classe.
Sebbene la definizione dei membri della classe come dllimport o dllexport è valido, non è possibile eseguire l'override dell'interfaccia specificata nella definizione della classe.
Se si definisce una funzione membro in una posizione diversa dal corpo della definizione della classe nella quale è stata dichiarata, un avviso viene generato se la funzione è definita come dllexport o dllimport (se questa definizione diversa da quella specificata nella dichiarazione di classe).