Compartir a través de


Importar mediante archivos DEF

Si decide usar __declspec(dllimport) junto con un archivo .def, debe cambiar el archivo .def para usar DATA en lugar de CONSTANT, a fin de reducir la probabilidad de que la codificación incorrecta cause un problema:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

En la siguiente tabla se muestra por qué.

Palabra clave Emite en la biblioteca de importación Exportaciones
CONSTANT _imp_ulDataInDll, _ulDataInDll _ulDataInDll
DATA _imp_ulDataInDll _ulDataInDll

Al usar __declspec(dllimport) y CONSTANT, se muestra la versión de imp y el nombre no representativo de la biblioteca de importación de DLL .lib que se crea para permitir la vinculación explícita. Al usar __declspec(dllimport) y DATA, solo muestra la versión imp del nombre.

Si usa CONSTANT, puede usar cualquiera de las siguientes construcciones de código para acceder a ulDataInDll:

__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L)   /*sample code fragment*/

o bien

ULONG *ulDataInDll;      /*prototype*/
if (*ulDataInDll == 0L)  /*sample code fragment*/

En cambio, si usa DATA en el archivo .def, solo el código compilado con la definición siguiente puede acceder a la variable ulDataInDll:

__declspec(dllimport) ULONG ulDataInDll;

if (ulDataInDll == 0L)   /*sample code fragment*/

El uso de CONSTANT es más arriesgado, dado que si se olvida de usar un nivel adicional de direccionamiento indirecto, podría acceder al puntero a la variable de la tabla de direcciones de importación, no a la variable en sí misma. Este tipo de problema a menudo se manifiesta como una infracción de acceso, puesto que el compilador y el enlazador hacen que la tabla de direcciones de importación sea de solo lectura.

El enlazador MSVC actual emite una advertencia si detecta CONSTANT en el archivo .def para dar cuenta de esto. La única razón real para usar CONSTANT es que no se pueda volver a compilar un archivo objeto donde el archivo de encabezado no mostró __declspec(dllimport) en el prototipo.

Consulte también

Importación a una aplicación