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 actual de Microsoft C++ (MSVC) emite una advertencia si ve CONSTANT en el archivo .def para tener en cuenta este caso. 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