Partager via


Détermination de la méthode d'exportation à utiliser

Mise à jour : novembre 2007

Pour déterminer la méthode à utiliser en vue d'exporter des fonctions (un fichier .def ou le mot clé __declspec(dllexport)), répondez aux questions suivantes :

  • Allez-vous continuer à ajouter des fonctions exportées supplémentaires ?

  • Qui utilise votre DLL ? Par exemple, s'agit-il d'une DLL tierce utilisée par de nombreux exécutables que vous ne pouvez pas régénérer ou la DLL est-elle utilisée uniquement par des applications que vous pouvez aisément régénérer ?

Avantages et inconvénients de l'utilisation de fichiers .DEF

L'exportation de fonctions dans un fichier .def permet de déterminer les ordinaux d'exportation. Lorsque vous ajoutez des fonctions exportées supplémentaires à la DLL, vous pouvez leur assigner des valeurs ordinales supérieures (supérieures à toute autre fonction exportée). En ce cas, les applications qui utilisent la liaison implicite n'ont pas besoin d'une réédition de leurs liens avec la nouvelle bibliothèque d'importation contenant les nouvelles fonctions. Ce point est très important, par exemple, si vous créez une DLL tierce devant être utilisée par de nombreuses applications. Vous pouvez continuer à améliorer votre DLL en lui ajoutant des fonctionnalités supplémentaires tout en faisant en sorte que les applications existantes continuent de fonctionner correctement avec la nouvelle DLL. Les DLL MFC sont générées à l'aide de fichiers .def.

Un autre avantage découlant de l'utilisation d'un fichier .def est que vous pouvez exporter des fonctions à l'aide de l'attribut NONAME, qui place uniquement l'ordinal dans la table d'exportations de la DLL. Pour les DLL comportant un grand nombre de fonctions exportées, l'utilisation de l'attribut NONAME peut réduire la taille du fichier DLL. Pour plus d'informations sur l'écriture d'une instruction de définition de module, consultez Règles s'appliquant aux instructions de définition de module. Pour plus d'informations sur l'exportation d'ordinaux, consultez Exportation de fonctions à partir d'une DLL par ordinal plutôt que par nom.

Le principal inconvénient lié à l'utilisation d'un fichier .def est que si vous exportez des fonctions dans un fichier C++, vous devez alors soit placer les noms décorés dans le fichier .def soit définir les fonctions exportées à l'aide d'une liaison C standard en utilisant extern "C" afin d'éviter la décoration des noms effectuée par le compilateur.

Si vous devez placer les noms décorés dans le fichier .def, vous pouvez les obtenir à l'aide de l'outil DUMPBIN ou en utilisant l'option /MAP de l'éditeur de liens. Notez que les noms décorés produits par le compilateur sont spécifiques à celui-ci. Si vous placez les noms décorés générés par le compilateur Visual C++ dans un fichier .def, les applications qui sont liées à votre DLL doivent, elles aussi, être générées à l'aide de la même version de Visual C++, afin que les noms décorés dans l'application appelante correspondent aux noms exportés dans le fichier .def de la DLL.

Avantages et inconvénients de l'utilisation de __declspec(dllexport)

L'utilisation de __declspec(dllexport) est pratique dans la mesure où vous n'avez pas à vous préoccuper de la gestion d'un fichier .def et de l'obtention des noms décorés des fonctions exportées. Par exemple, cette méthode est idéale si vous concevez une DLL destinée à une utilisation avec une application que vous contrôlez. Si vous régénérez la DLL avec de nouvelles exportations, vous devez également régénérer l'application, car les noms décorés des fonctions C++ exportées peuvent changer si vous effectuez une recompilation avec une version différente du compilateur.

Que voulez-vous faire ?

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

Voir aussi

Concepts

Exportation à partir d'une DLL