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

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. Si vous n’utilisez pas le __declspec(dllexport) mot clé pour exporter les fonctions de la dll, la dll requiert un fichier def.

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

  • La première instruction dans le 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 assignez la fonction à une valeur ordinale en suivant le nom de la fonction avec un arobase (@) et un nombre. 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. 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 un arbre de recherche binaire peut se présenter comme 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 de définition 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 à Project>propriétés>fichier de définition du Moduled’entrée> de l’éditeur deliens> et entrez le nom du fichier DEF. Répétez cette étape pour chaque configuration et plateforme, ou faites-la tout à la fois en sélectionnant configuration = toutes les configurationset 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 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 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.

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.

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 :

#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, quand vous dérivez une classe à l’aide DECLARE_DYNAMIC de, la macro se développe pour ajouter une CRuntimeClass variable membre à votre classe. 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.

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

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

Que voulez-vous faire ?

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

Voir aussi

Exportation à partir d'une DLL