Importation de données à l’aide de __declspec(dllimport)
Dans le cas des données, l’utilisation __declspec(dllimport)
est un élément pratique qui supprime une couche d’indirection. Lorsque vous importez des données à partir d’une DLL, vous devez toujours passer par la table d’adresses d’importation. Avant __declspec(dllimport)
, cela signifie que vous deviez vous rappeler d’effectuer un niveau supplémentaire d’indirection lors de l’accès aux données exportées à partir de la DLL :
// project.h
// Define PROJECT_EXPORTS when building your DLL
#ifdef PROJECT_EXPORTS // If accessing the data from inside the DLL
ULONG ulDataInDll;
#else // If accessing the data from outside the DLL
ULONG *ulDataInDll;
#endif
Vous allez ensuite exporter les données dans votre . Fichier DEF :
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
et y accéder en dehors 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’indirection pour vous. Vous n’avez plus à vous soucier des étapes ci-dessus. Comme indiqué précédemment, n’utilisez __declspec(dllimport)
pas de déclaration sur les données lors de la génération de la DLL. Les fonctions au sein de la DLL n’utilisent pas la table d’adresses d’importation pour accéder à l’objet de données ; par conséquent, vous n’aurez pas le niveau supplémentaire d’indirection présent.
Pour exporter automatiquement les données à partir de la DLL, utilisez cette déclaration :
// project.h
// Define PROJECT_EXPORTS when building your DLL
#ifdef PROJECT_EXPORTS // If accessing the data from inside the DLL
__declspec(dllexport) ULONG ulDataInDLL;
#else // If accessing the data from outside the DLL
__declspec(dllimport) ULONG ulDataInDLL;
#endif