Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.