Importazione di dati tramite __declspec(dllimport)
Nel caso dei dati, l'uso __declspec(dllimport)
di è un elemento pratico che rimuove un livello di riferimento indiretto. Quando si importano dati da una DLL, è comunque necessario passare attraverso la tabella degli indirizzi di importazione. Prima __declspec(dllimport)
di , ciò significava che era necessario ricordare di eseguire un livello aggiuntivo di riferimento indiretto quando si accede ai dati esportati dalla 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
Si esportano quindi i dati in . File DEF:
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
e accedervi all'esterno 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. Non è più necessario preoccuparsi dei passaggi precedenti. Come indicato in precedenza, non usare __declspec(dllimport)
la dichiarazione sui dati durante la compilazione della DLL. Le funzioni all'interno della DLL non usano la tabella degli indirizzi di importazione per accedere all'oggetto dati; pertanto, non si avrà il livello aggiuntivo di riferimento indiretto presente.
Per esportare automaticamente i dati dalla DLL, usare questa dichiarazione:
// 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