Détermination de la méthode d'exportation à utiliser
Vous pouvez exporter des fonctions dans deux des fichiers de manière - .def ou du mot clé d' __declspec(dllexport) .Pour vous aider à décider quelle méthode est préférable de votre DLL, considérez ces questions :
Organisez-vous pour exporter plus de fonctions ultérieurement ?
Est-ce-que la DLL est -il utilisé uniquement par les applications que vous pouvez régénérer, ou il est utilisé par les applications que vous ne pouvez pas reconstruction- pour l'exemple, les applications créées par des tiers ?
Pour le et inconvénients de l'utilisation des fichiers .def
Exportation de fonctions dans un fichier .def vous donne le contrôle des ordinaux d'exportation.Lorsque vous ajoutez une fonction exportée vers la DLL, vous pouvez lui assigner une valeur ordinale plus élevée que toute autre fonction exportée.Dans ce cas, les applications utilisant la liaison implicite ne doivent pas reconnecter avec la bibliothèque d'importation qui contient la nouvelle fonction.Cela s'avère utile si vous concevez une DLL pour être utilisée par de nombreuses applications car vous pouvez ajouter de nouvelles fonctionnalités et également de vérifier qu'il continue à fonctionner correctement avec les applications qui dépendent déjà sur celui-ci.Par exemple, les DLL MFC sont générés à l'aide de fichiers .def.
Un autre avantage d'utiliser un fichier .def est que vous pouvez utiliser l'attribut d' NONAME pour exporter une fonction.Cela met uniquement l'ordinal dans la table d'exportations de la DLL.Pour les DLL qui ont un grand nombre de fonctions exportées, à l'aide de l'attribut d' 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 ordinale, consultez l' Exportation de fonctions à partir d'une DLL par ordinal plutôt que par nom.
Un inconvénient d'utiliser 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 soit définir les fonctions exportées à l'aide de extern « C » pour éviter la décoration de nom qui est effectuée par le compilateur Visual C++.
Si vous mettez les noms décorés dans le fichier .def, vous pouvez les obtenir à l'aide de l'outil d' POUBELLE ou en utilisant l'option d' /MAP d'éditeur de liens.Les noms décorés produits par le compilateur sont compilateur spécifiques ; par conséquent, si vous mettez les noms décorés produits par le compilateur dans un fichier .def, les applications que le lien à la DLL doit également être généré à l'aide de 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)
Utilisation __declspec(dllexport) est pratique car vous n'avez pas à vous préoccuper de mettre à jour un fichier .def et d'obtenir les noms décorés des fonctions exportées.Toutefois, l'utilité de cette façon d'exporter est limitée par le nombre d'applications liées que vous êtes disposé à le régénérer.Si vous régénérez la DLL avec de nouvelles exportations, vous devez également régénérer les applications car les noms décorés des fonctions exportées C++ peuvent changer si vous utilisez une version différente du compilateur pour le régénérer.
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 en langage C ou C++
Importer dans une application à l'aide de __declspec(dllimport)