Importación de datos con __declspec(dllimport)
En el caso de los datos, __declspec(dllimport)
es un práctico elemento que quita una capa de direccionamiento indirecto. Cuando importe datos desde un archivo DLL, seguirá teniendo que pasar por la tabla de direcciones de importación. Antes de que existiera __declspec(dllimport)
, esto significaba que debía acordarse de realizar un nivel adicional de direccionamiento indirecto al acceder a los datos exportados desde el archivo 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
Después, debía exportar los datos al archivo .def:
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
Y acceder a ellos fuera del archivo DLL:
if (*ulDataInDll == 0L)
{
// Do stuff here
}
Cuando los datos se marcan como __declspec(dllimport)
, el compilador genera automáticamente el código de direccionamiento indirecto. Ya no tiene que encargarse de los pasos anteriores. Como ya se ha indicado, no use la declaración __declspec(dllimport)
en los datos al compilar el archivo DLL. Las funciones del archivo DLL no usan la tabla de direcciones de importación para acceder al objeto de datos, por lo que no habrá presente un nivel de direccionamiento indirecto adicional.
Para exportar los datos automáticamente desde el archivo DLL, use esta declaración:
// 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