Déterminer la méthode d'exportation à utiliser
Vous pouvez exporter des fonctions dans les deux fichiers à la fois : un fichier .def ou le mot clé __declspec(dllexport)
. Pour vous aider à déterminer quelles méthodes sont les plus appropriées pour la DLL, tenez compte de ces questions :
Prévoyez-vous d'exporter des fonctions ultérieurement ?
Est-ce-que votre DLL est uniquement utilisée par les applications que vous pouvez régénérer, ou est-elle utilisée par les applications que vous ne pouvez pas régénérer, par exemple, les applications créées par des concepteurs tiers ?
Avantages et inconvénients de l'utilisation des fichiers .def
L'exportation de fonctions dans un fichier .def permet de déterminer les ordinaux d'exportation. Lorsque vous ajoutez une fonction exportée supplémentaire à la DLL, vous pouvez leur assigner une valeur ordinale supérieure (supérieure à toute autre fonction exportée). Dans ce cas, les applications qui utilisent la liaison implicite n'ont pas besoin d'une réédition de leurs liens avec la bibliothèque d'importation contenant la nouvelle fonction. Il est très pratique si vous concevez une DLL destinée à de nombreuses applications car vous pouvez ajouter de nouvelles fonctionnalités et également vérifier qu'elles continuent à fonctionner correctement avec les applications qui reposent dessus. Par exemple, les DLL MFC sont générées à l'aide des fichiers .def.
Un autre avantage de l'utilisation d'un fichier .def est que vous pouvez utiliser l'attribut NONAME
pour exporter une fonction. Cela met uniquement l'ordinal dans la table d'exportation 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 pour les instructions de définition de module. Pour plus d’informations sur l’exportation ordinale, consultez Exportation de fonctions à partir d’une DLL par Ordinal plutôt que par nom.
L’inconvénient de l’utilisation d’un fichier .def est que si vous exportez des fonctions dans un fichier C++, vous devez placer les noms décorés dans le fichier .def ou définir les fonctions exportées à l’aide de l’extern « C » pour éviter la décoration des noms effectuée par le compilateur MSVC.
Si vous placez 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 éditeur de liens. Les noms décorés qui sont produits par le compilateur lui sont spécifiques ; par conséquent, si vous mettez des noms décorés produits par le compilateur dans un fichier .def, les applications liées à la DLL doivent également être créées en utilisant la même version du compilateur 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 ni de l'obtention des noms décorés des fonctions exportées. Toutefois, l'utilité de ce mode d'exportation est limité par le nombre d'applications liées que vous êtes prêt à reconstruire. Si vous régénérez la DLL avec de nouvelles exportations, vous devrez é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 ?
Exporter à partir d’une DLL à l’aide de __declspec(dllexport)
Exporter des fonctions C++ à utiliser dans des exécutables en langage C
Exporter des fonctions C à utiliser dans des exécutables C ou C++-language
Importer dans une application à l'aide de __declspec(dllimport)