Partilhar via


Importando usando arquivos DEF

Se você optar por usar __declspec(dllimport) junto com um arquivo .def, deverá alterar o arquivo .def para usar DATA no lugar de CONSTANT para reduzir a probabilidade de que a codificação incorreta cause um problema:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

A tabela a seguir mostra o porquê.

Palavra-chave Emissões na biblioteca de importação Exportações
CONSTANT _imp_ulDataInDll, _ulDataInDll _ulDataInDll
DATA _imp_ulDataInDll _ulDataInDll

Usando __declspec(dllimport) e CONSTANT lista a imp versão e o nome não decorado na biblioteca de importação de DLL .lib criada para permitir vinculação explícita. Usando __declspec(dllimport) e DATA lista apenas a imp versão do nome.

Se você usar CONSTANT, uma das seguintes construções de código pode ser usada para acessar ulDataInDll:

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

-ou-

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

No entanto, se você usar DATA em seu arquivo .def, somente o código compilado com a seguinte definição poderá acessar a variável ulDataInDll:

__declspec(dllimport) ULONG ulDataInDll;

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

Usar CONSTANT é mais arriscado porque, se você esquecer de usar o nível extra de indireção, poderá acessar o ponteiro da tabela de endereços de importação para a variável — não a variável em si. Esse tipo de problema pode manifestar-se muitas vezes como uma violação de acesso, porque a tabela de endereços de importação é atualmente configurada como somente leitura pelo compilador e o ligador.

O vinculador atual do Microsoft C++ (MSVC) emite um aviso se ele vê CONSTANT no arquivo .def para levar em conta esse caso. A única razão real para usar CONSTANT é se você não pode recompilar algum arquivo de objeto onde o arquivo de cabeçalho não foi listado __declspec(dllimport) no protótipo.

Ver também

Importando para um aplicativo