Importazione di dati tramite __declspec(dllimport)
Nel caso dei dati, l'utilizzo di __declspec(dllimport) consente di rimuovere un livello di riferimento indiretto. Quando si importano i dati da una DLL, occorre comunque consultare la tabella IAT. Prima dell'introduzione di __declspec(dllimport), per accedere ai dati esportati dalla DLL era necessario utilizzare un livello aggiuntivo di riferimento indiretto:
// 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
I dati venivano quindi esportati nel file DEF:
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
e l'accesso avveniva al di fuori della DLL:
if (*ulDataInDll == 0L)
{
// Do stuff here
}
Quando si contrassegnano i dati come __declspec(dllimport), il compilatore genera automaticamente il codice di riferimento indiretto evitando di dover effettuare i passaggi sopra descritti. Come segnalato in precedenza, non utilizzare la dichiarazione __declspec(dllimport) sui dati durante la compilazione della DLL. Poiché le funzioni nella DLL non utilizzano la tabella IAT per accedere agli oggetti di dati, il livello aggiuntivo di riferimento indiretto non sarà presente.
Per esportare i dati automaticamente dalla DLL, utilizzare questa dichiarazione:
__declspec(dllexport) ULONG ulDataInDLL;