Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.