Importation de données à l'aide de __declspec(dllimport)
Dans le cas des données, l'utilisation de __declspec(dllimport) est pratique car elle permet de supprimer une couche d'adressage indirect. Lorsque vous importez des données à partir d'une DLL, vous devez encore passer par la table des adresses d'importation. Cela signifie qu'avant l'existence de __declspec(dllimport), il fallait penser à effectuer un niveau supplémentaire d'adressage indirect lors de l'accès aux données exportées à partir de la DLL :
// project.h
#ifdef _DLL // If accessing the data from inside the DLL
ULONG ulDataInDll;
#else // If accessing the data from outside the DLL
ULONG *ulDataInDll;
#endif
Il fallait alors exporter les données dans le fichier .DEF :
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
et y accéder depuis l'extérieur de la DLL :
if (*ulDataInDll == 0L)
{
// Do stuff here
}
Lorsque vous marquez les données en tant que __declspec(dllimport), le compilateur génère automatiquement le code d'adressage indirect. Vous n'avez plus à vous préoccuper des étapes ci-dessus. Comme indiqué précédemment, n'utilisez pas la déclaration __declspec(dllimport) sur les données lors de la génération de la DLL. Les fonctions de la DLL n'utilisent pas la table des adresses d'importation pour accéder à l'objet de données ; le niveau supplémentaire d'adressage indirect sera donc supprimé.
Pour exporter les données automatiquement à partir de la DLL, utilisez cette déclaration :
__declspec(dllexport) ULONG ulDataInDLL;