Partage via


EXPORTS

Introduit une section d'une ou plusieurs définitions d'exportation qui spécifient les ordinaux ou noms exportés des fonctions ou données. Chaque définition doit être sur une ligne distincte.

EXPORTS
   definition

Notes

La première définition peut être sur la même ligne que le EXPORTS mot clé ou sur une ligne suivante. Le fichier .DEF peut contenir une ou plusieurs instructions EXPORTS.

La syntaxe d’une définition d’exportation est la suivante :

entryname[=internal_name|other_module.export_name] [@ordinal [NONAME] ] [ [PRIVATE] | [DATA] ]

entryname est la fonction ou le nom de variable que vous souhaitez exporter. Obligatoire. Si le nom que vous exportez diffère du nom dans la DLL, spécifiez le nom de l’exportation dans la DLL à l’aide de internal_name. Par exemple, si votre DLL exporte une fonction func1 et que vous voulez que les appelants l'utilisent comme func2, vous devez spécifier :

EXPORTS
   func2=func1

Si le nom que vous exportez provient d’un autre module, spécifiez le nom de l’exportation dans la DLL à l’aide de other_module.export_name. Par exemple, si votre DLL exporte une fonction other_module.func1 et que vous voulez que les appelants l'utilisent comme func2, vous devez spécifier :

EXPORTS
   func2=other_module.func1

Si le nom que vous exportez provient d’un autre module qui exporte par ordinal, spécifiez l’ordinal de l’exportation dans la DLL à l’aide de other_module.#ordinal. Par exemple, si votre DLL exporte une fonction à partir de l’autre module où il est ordinal 42 et que vous souhaitez que les appelants l’utilisent comme func2, vous spécifiez :

EXPORTS
   func2=other_module.#42

Étant donné que le compilateur MSVC utilise la décoration de noms pour les fonctions C++, vous devez utiliser le nom décoré internal_name ou définir les fonctions exportées à l’aide extern "C" du code source. Le compilateur décore également les fonctions C qui utilisent la convention d’appel __stdcall avec un préfixe de trait de soulignement (_) et un suffixe composé du signe at (@) suivi du nombre d’octets (en décimal) dans la liste d’arguments.

Pour rechercher les noms décorés générés par le compilateur, utilisez l’outil DUMPBIN ou l’option /MAP de l’éditeur de liens. Les noms décorés sont spécifiques au compilateur. Si vous exportez les noms décorés dans le fichier .DEF, les exécutables qui sont liés à la DLL doivent également être générés à l'aide la même version du compilateur. Cela garantit que les noms décorés dans l'appelant correspondent aux noms exportés dans le fichier .DEF.

Vous pouvez utiliser @ordinal pour spécifier qu’un nombre, et non le nom de la fonction, entre dans la table d’exportation de la DLL. De nombreuses DLL Windows exportent des ordinaux pour prendre en charge du code hérité. Il était courant d'utiliser des ordinaux dans le code Windows 16 bits, car cela peut aider à réduire la taille d'une DLL. Nous vous déconseillons d’exporter des fonctions par ordinal, sauf si les clients de votre DLL en ont besoin pour la prise en charge héritée. Comme le fichier .LIB contiendra le mappage entre l'ordinal et la fonction, vous pouvez utiliser le nom de fonction comme vous le feriez normalement dans les projets qui utilisent la DLL.

En utilisant le mot clé NONAME facultatif, vous pouvez exporter uniquement par ordinal et réduire la taille de la table d’exportation dans la DLL résultante. Toutefois, si vous souhaitez utiliser GetProcAddress sur la DLL, vous devez connaître l’ordinal, car le nom n’est pas valide.

Le mot clé facultatif PRIVATE empêche l’inclusion du nom d’entrée dans la bibliothèque d’importation générée par LINK. Il n'affecte pas l'exportation dans l'image également générée par LINK.

Le mot clé facultatif DATA spécifie qu’une exportation est des données, et non du code. Cet exemple illustre comment vous pouvez exporter une variable de données nommée exported_global :

EXPORTS
   exported_global DATA

Il existe quatre méthodes pour exporter une définition, répertoriées dans l'ordre recommandé :

  1. Mot clé __declspec(dllexport) dans le code source

  2. Une instruction EXPORTS dans un fichier .DEF

  3. Spécification /EXPORT dans une commande LINK

  4. Directive de commentaire dans le code source, du formulaire #pragma comment(linker, "/export: definition "). L’exemple suivant montre une directive de commentaire #pragma avant une déclaration de fonction, où PlainFuncName est le nom non décoré et _PlainFuncName@4 le nom décoré de la fonction :

    #pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4")
    BOOL CALLBACK PlainFuncName( Things * lpParams)
    

La directive #pragma est utile si vous avez besoin d’exporter un nom de fonction non optimisé et d’avoir des exportations différentes en fonction de la configuration de build (par exemple, dans les builds 32 bits ou 64 bits).

Ces quatre méthodes peuvent être utilisées dans le même programme. Quand LINK génère un programme qui contient des exportations, il crée également une bibliothèque d'importation, à moins qu'un fichier .EXP soit utilisé dans la build.

Voici un exemple de section EXPORTS :

EXPORTS
   DllCanUnloadNow      @1          PRIVATE
   DllWindowName = WindowName       DATA
   DllGetClassObject    @4 NONAME   PRIVATE
   DllRegisterServer    @7
   DllUnregisterServer

Quand vous exportez une variable à partir d'une DLL en utilisant un fichier .DEF, vous n'êtes pas tenu de spécifier __declspec(dllexport) sur la variable. Toutefois, dans tout fichier qui utilise la DLL, vous devez encore utiliser __declspec(dllimport) sur la déclaration des données.

Voir aussi

Règles s’appliquant aux instructions de définition de module