À l'aide de dllimport et le dllexport dans les classes C++
Spécifique à Microsoft
Vous pouvez déclarer des classes C++ avec l'attribut de dllimport ou d' dllexport .ces formulaires impliquent que la classe entière est importée ou exportée.Les classes ont exporté de cette façon sont appelées des classes exportés.
l'exemple suivant définit une classe exportable.toutes ses fonctions membres et données statiques sont exportées :
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
Notez qu'explicite utilisez de dllimport et d' dllexport sur les membres d'une classe exportable est interdit.
classes de dllexport
Lorsque vous déclarez une classe dllexport, toutes ses fonctions membres et données membres statiques sont exportées.Vous devez fournir les définitions de tous ces membres dans le même programme.Sinon, une erreur de l'éditeur de liens est générée.La seule exception à cette règle s'applique aux fonctions virtuelles purs, pour lesquelles vous n'avez pas besoin de fournir des définitions explicites.Toutefois, étant donné qu'un destructeur d'une classe abstraite est toujours appelé par le destructeur de la classe de base, les destructeurs virtuels purs doivent toujours fournir une définition.notez que ces règles sont les mêmes pour les classes nonexportable.
Si vous exportez les données de la classe tapez ou les fonctions que les classes de retour, être fiables d'exporter la classe.
classes de dllimport
Lorsque vous déclarez une classe dllimport, toutes ses fonctions membres et données membres statiques sont importées.Contrairement au comportement de dllimport et d' dllexport sur les types sans classe, les données membres static ne peuvent pas spécifier une définition dans le même programme où une classe de dllimport est définie.
Héritage et classes exportés
Toutes les classes de base d'une classe exportable doivent être exportés.Dans le cas contraire, un avertissement du compilateur est généré.De plus, tous les membres accessibles qui sont également des classes doivent être exportés.Cette règle permet à une classe d' dllexport d'hériter d'une classe de dllimport , et une classe de dllimport d'hériter d'une classe d' dllexport (bien que ce dernier n'est pas recommandé).En règle générale, tout ce qui est accessible au client de la DLL (conformément à les règles d'accès C++) doit faire partie de l'interface exportable.Cela inclut les membres de données privées référencés dans les fonctions inline.
Importation et exportation membres sélectives
Comme les fonctions membres et les données statiques dans une classe a implicitement une liaison externe, vous pouvez les déclarer avec l'attribut de dllimport ou d' dllexport , à moins que la classe entière soit exportée.Si la classe entière est importée ou exportée, la déclaration explicite des fonctions membres et les données sous forme dllimport ou dllexport est interdite.Si vous déclarez une donnée membre statique dans une définition de classe comme dllexport, une définition doit se produire trouve à l'intérieur de le même programme (qu'avec la liaison externe de nonclass).
de même, vous pouvez déclarer des fonctions membres avec les attributs de dllimport ou d' dllexport .Dans ce cas, vous devez fournir une définition d' dllexport trouve à l'intérieur de le même programme.
Il est utile de noter plusieurs aspects importants concernant l'importation et l'exportation membres sélectives :
L'importation et exportation membres sélectives convient mieux pour fournir une version de l'interface de classe exportée qui est plus restrictive ; autrement dit, un pour lequel vous pouvez concevoir une DLL qui expose moins le public et les fonctionnalités privées que le langage laisserait sinon.il est également utile pour régler avec précision l'interface exportable : lorsque vous savez que le client, par définition, ne peut pas accéder à des données privées, vous n'avez pas besoin d'exporter la classe entière.
si vous exportez une fonction virtuelle dans une classe, vous devez exporter tous, ou fournissez au moins les versions que le client peut utiliser directement.
Si vous utilisez une classe dans laquelle vous utilisez l'importation et exportation membres sélectives avec des fonctions virtuelles, les fonctions doivent être dans l'interface exportable ou l'défini inline (visible au client).
Si vous définissez un membre comme dllexport mais ne l'ajoutez pas dans la définition de classe, une erreur de compilation est générée.Vous devez définir le membre dans l'en-tête de la classe.
Bien que la définition des membres de classe comme dllimport ou dllexport est autorisée, vous ne pouvez pas remplacer l'interface spécifiée dans la définition de classe.
Si vous définissez une fonction membre dans un emplacement autre que le corps de la définition de classe dans laquelle vous l'avez déclaré, un avertissement est généré si la fonction est définie comme dllexport ou dllimport (si cette définition est différente de celle spécifiée dans la déclaration de classe).