Exportation à partir d'une DLL à l'aide de fichiers DEF

Un fichier de définition de module ou DEF (*.def) est un fichier texte contenant une ou plusieurs instructions de module qui décrivent différents attributs d’une DLL. Si vous n’utilisez pas le __declspec(dllexport) mot clé pour exporter les fonctions de la DLL, la DLL nécessite un fichier DEF.

Un fichier DEF minimal doit contenir les instructions de définition de module suivantes :

  • La première instruction du fichier doit être l’instruction LIBRARY. Cette instruction identifie le fichier DEF comme appartenant à une DLL. L’instruction LIBRARY est suivie du nom de la DLL. L’éditeur de liens place ce nom dans la bibliothèque d’importation de la DLL.

  • L’instruction EXPORTS répertorie les noms et, éventuellement, les valeurs ordinales des fonctions exportées par la DLL. Vous affectez à la fonction une valeur ordinale en suivant le nom de la fonction avec un signe at sign (@) et un nombre. Lorsque vous spécifiez des valeurs ordinales, elles doivent figurer dans la plage 1 à N, où N correspond au nombre de fonctions exportées par la DLL. Si vous souhaitez exporter des fonctions par ordinal, consultez Exportation de fonctions à partir d’une DLL par Ordinal plutôt que par nom , ainsi que cette rubrique.

Par exemple, une DLL qui contient le code permettant d’implémenter une arborescence de recherche binaire peut ressembler à ce qui suit :

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Si vous utilisez l’Assistant DLL MFC pour créer une DLL MFC, l’Assistant crée un fichier DEF squelette pour vous et l’ajoute automatiquement à votre projet. Ajoutez les noms des fonctions à exporter dans ce fichier. Pour les DLL non MFC, créez vous-même le fichier DEF et ajoutez-le à votre projet. Accédez ensuite au >fichier de définition du module d’entrée>de l’Éditeur>de propriétés>du projet et entrez le nom du fichier DEF. Répétez cette étape pour chaque configuration et plateforme, ou effectuez-la en une seule fois en sélectionnant Configuration = Toutes les configurations et Plateforme = Toutes les plateformes.

Si vous exportez des fonctions dans un fichier C++, vous devez placer les noms décorés dans le fichier DEF ou définir vos fonctions exportées avec une liaison C standard à l’aide de l’extern « C ». Si vous devez placer les noms décorés dans le fichier DEF, vous pouvez les obtenir à l’aide de l’outil DUMPBIN ou à l’aide de l’option /MAP de l’éditeur de liens. Notez que les noms décorés produits par le compilateur sont spécifiques au compilateur. Si vous placez les noms décorés produits par le compilateur Microsoft C++ (MSVC) dans un fichier DEF, les applications liées à votre DLL doivent également être générées à l’aide de la même version de MSVC afin que les noms décorés dans l’application appelante correspondent aux noms exportés dans le fichier DEF de la DLL.

Remarque

Une DLL générée avec Visual Studio 2015 peut être consommée par les applications créées avec Visual Studio 2017 ou Visual Studio 2019.

Si vous générez une DLL d’extension et que vous exportez à l’aide d’un fichier DEF, placez le code suivant au début et à la fin de vos fichiers d’en-tête qui contiennent les classes exportées :

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Ces lignes garantissent que les variables MFC utilisées en interne ou ajoutées à vos classes sont exportées (ou importées) à partir de votre DLL d’extension MFC. Par exemple, lors de la dérivation d’une classe à l’aide DECLARE_DYNAMICde , la macro s’étend pour ajouter une CRuntimeClass variable membre à votre classe. L’abandon de ces quatre lignes peut entraîner la compilation ou la liaison incorrecte de votre DLL ou provoquer une erreur lorsque l’application cliente est liée à la DLL.

Lors de la génération de la DLL, l’éditeur de liens utilise le fichier DEF pour créer un fichier d’exportation (.exp) et un fichier de bibliothèque d’importation (.lib). L’éditeur de liens utilise ensuite le fichier d’exportation pour générer le fichier DLL. Exécutables qui sont implicitement liés au lien DLL vers la bibliothèque d’importation lorsqu’ils sont générés.

Notez que MFC utilise lui-même des fichiers DEF pour exporter des fonctions et des classes à partir de MFCx0.dll.

Que voulez-vous faire ?

Sur quels éléments souhaitez-vous obtenir des informations supplémentaires ?

Voir aussi

Exportation à partir d’une DLL