Exportation à partir d'une DLL à l'aide de __declspec(dllexport)
Mise à jour : novembre 2007
Microsoft a introduit __export dans la version 16 bits du compilateur de Visual C++ afin de permettre à ce compilateur de générer automatiquement les noms des exportations et de les placer dans un fichier .lib. Ce fichier .lib peut ensuite être utilisé comme un fichier .lib statique pour établir une liaison avec une DLL.
Dans les versions les plus récentes du compilateur, vous pouvez exporter les données, les fonctions, les classes ou les fonctions membres d'une classe à partir d'une DLL à l'aide du mot clé __declspec(dllexport). __declspec(dllexport) ajoute la directive d'exportation au fichier objet, vous n'avez pas besoin d'utiliser un fichier .def.
Ce côté pratique est surtout visible lorsque vous essayez d'exporter des noms décorés de fonctions C++. Comme il n'existe pas de spécification standard pour la décoration des noms, le nom d'une fonction exportée peut changer d'une version de compilateur à l'autre. Si vous utilisez __declspec(dllexport), la recompilation de la DLL et des fichiers .exe dépendants est nécessaire uniquement pour tenir compte d'éventuelles modifications intervenues dans la convention d'attribution de noms.
De nombreuses directives d'exportation, telles que les ordinaux, NONAME et PRIVATE, ne peuvent être insérées que dans un fichier .def, et il n'existe aucun moyen de spécifier ces attributs sans un fichier .def. Cependant, l'utilisation de __declspec(dllexport) en plus de celle d'un fichier .def ne provoque pas d'erreur de génération.
Pour exporter des fonctions, le mot clé __declspec(dllexport) doit apparaître à gauche du mot clé de la convention d'appel, si un mot clé est spécifié. Par exemple :
__declspec(dllexport) void __cdecl Function1(void);
Pour exporter toutes les données membres publiques et les fonctions membres d'une classe, vous devez faire figurer le mot clé à gauche du nom de la classe, comme suit :
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Lorsque vous générez la DLL, vous créez généralement un fichier d'en-tête contenant les prototypes et/ou les classes des fonctions que vous exportez, puis ajoutez __declspec(dllexport) aux déclarations du fichier d'en-tête. Pour rendre le code plus lisible, définissez une macro pour __declspec(dllexport) puis utilisez cette macro avec chaque symbole exporté :
#define DllExport __declspec( dllexport )
__declspec(dllexport) stocke des noms de fonctions dans la table d'exportations de la DLL. Si vous souhaitez optimiser la taille de la table, consultez Exportation de fonctions à partir d'une DLL par ordinal plutôt que par nom.
Remarque : |
---|
Lorsque vous convertissez le code source de la DLL de Win16 en Win32, remplacez chaque instance de __export par __declspec(dllexport). |
Comme référence, parcourez le fichier d'en-tête Winbase.h Win32. Il contient des exemples d'utilisation de __declspec(dllimport).
Que voulez-vous faire ?
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)