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).

Vedere anche

Riferimenti

dllexport, dllimport