Exportation à partir d'une DLL à l'aide de fichiers DEFExporting from a DLL Using DEF Files

Un fichier de définition de module ou de fichier DEF (*. def) est un fichier texte contenant une ou plusieurs instructions de module qui décrivent différents attributs d’une DLL.A module-definition or DEF file (*.def) is a text file containing one or more module statements that describe various attributes of a DLL. Si vous n’utilisez pas le __declspec(dllexport) mot clé pour exporter les fonctions de la dll, la dll requiert un fichier def.If you are not using the __declspec(dllexport) keyword to export the DLL's functions, the DLL requires a DEF file.

Un fichier DEF minimal doit contenir les instructions de définition de module suivantes :A minimal DEF file must contain the following module-definition statements:

  • La première instruction dans le fichier doit être l’instruction LIBRARY.The first statement in the file must be the LIBRARY statement. Cette instruction identifie le fichier DEF comme appartenant à une DLL.This statement identifies the DEF file as belonging to a DLL. L’instruction LIBRARY est suivie du nom de la DLL.The LIBRARY statement is followed by the name of the DLL. L’éditeur de liens place ce nom dans la bibliothèque d’importation de la DLL.The linker places this name in the DLL's import library.

  • L’instruction EXPORTS répertorie les noms et, éventuellement, les valeurs ordinales des fonctions exportées par la DLL.The EXPORTS statement lists the names and, optionally, the ordinal values of the functions exported by the DLL. Vous assignez la fonction à une valeur ordinale en suivant le nom de la fonction avec un arobase (@) et un nombre.You assign the function an ordinal value by following the function's name with an at sign (@) and a number. Lorsque vous spécifiez des valeurs ordinales, elles doivent être comprises dans la plage 1 à N, où N est le nombre de fonctions exportées par la DLL.When you specify ordinal values, they must be in the range 1 through N, where N is the number of functions exported by the 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.If you want to export functions by ordinal, see Exporting Functions from a DLL by Ordinal Rather Than by Name as well as this topic.

Par exemple, une DLL qui contient le code permettant d’implémenter un arbre de recherche binaire peut se présenter comme suit :For example, a DLL that contains the code to implement a binary search tree might look like the following:

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 de définition squelette pour vous et l’ajoute automatiquement à votre projet.If you use the MFC DLL Wizard to create an MFC DLL, the wizard creates a skeleton DEF file for you and automatically adds it to your project. Ajoutez les noms des fonctions à exporter dans ce fichier.Add the names of the functions to be exported to this file. Pour les dll non-MFC, créez vous-même le fichier DEF et ajoutez-le à votre projet.For non-MFC DLLs, create the DEF file yourself and add it to your project. Accédez ensuite à > Propriétés > > du projet fichier de définition du module d’entrée de l’éditeur de liens > et entrez le nom du fichier def.Then go to Project > Properties > Linker > Input > Module Definition File and enter the name of the DEF file. Répétez cette étape pour chaque configuration et plateforme, ou faites-la tout à la fois en sélectionnant configuration = toutes les configurations et plateforme = toutes les plateformes.Repeat this step for each configuration and platform, or do it all at once by selecting Configuration = All Configurations, and Platform = All Platforms.

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 extern "C".If you are exporting functions in a C++ file, you have to either place the decorated names in the DEF file or define your exported functions with standard C linkage by using 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.If you need to place the decorated names in the DEF file, you can obtain them by using the DUMPBIN tool or by using the linker /MAP option. Notez que les noms décorés produits par le compilateur sont spécifiques au compilateur.Note that the decorated names produced by the compiler are compiler specific. Si vous placez les noms décorés produits par le compilateur Microsoft C++ (MSVC) dans un fichier DEF, les applications qui lient à 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.If you place the decorated names produced by the Microsoft C++ compiler (MSVC) into a DEF file, applications that link to your DLL must also be built using the same version of MSVC so that the decorated names in the calling application match the exported names in the DLL's DEF file.

Notes

Une DLL générée avec Visual Studio 2015 peut être consommée par les applications générées avec Visual Studio 2017 ou Visual Studio 2019.A DLL built with Visual Studio 2015 can be consumed by applications built with Visual Studio 2017 or Visual Studio 2019.

Si vous générez une dll d’extensionet 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 :If you are building an extension DLL, and exporting using a DEF file, place the following code at the beginning and end of your header files that contain the exported classes:

#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.These lines ensure that MFC variables that are used internally or that are added to your classes are exported (or imported) from your MFC extension DLL. Par exemple, quand vous dérivez une classe à l’aide de DECLARE_DYNAMIC , la macro se développe pour ajouter une CRuntimeClass variable membre à votre classe.For example, when deriving a class using DECLARE_DYNAMIC, the macro expands to add a CRuntimeClass member variable to your class. Le fait de laisser ces quatre lignes peut entraîner la compilation ou le lien de votre DLL de manière incorrecte, ou provoquer une erreur lorsque l’application cliente est liée à la DLL.Leaving out these four lines might cause your DLL to compile or link incorrectly or cause an error when the client application links to the 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).When building the DLL, the linker uses the DEF file to create an export (.exp) file and an import library (.lib) file. L’éditeur de liens utilise ensuite le fichier d’exportation pour générer le fichier DLL.The linker then uses the export file to build the DLL file. Les exécutables qui sont implicitement liés à la DLL sont liés à la bibliothèque d’importation lorsqu’ils sont générés.Executables that implicitly link to the DLL link to the import library when they are built.

Notez que MFC lui-même utilise des fichiers DEF pour exporter des fonctions et des classes à partir de la MFCx0.dll.Note that MFC itself uses DEF files to export functions and classes from the MFCx0.dll.

Que voulez-vous faire ?What do you want to do?

Sur quels éléments souhaitez-vous obtenir des informations supplémentaires ?What do you want to know more about?

Voir aussiSee also

Exportation à partir d'une DLLExporting from a DLL