Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 codificação incorreta causar um problema:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
A tabela a seguir mostra por quê.
| Palavra-chave | Emite na biblioteca de importação | Exportações |
|---|---|---|
CONSTANT |
_imp_ulDataInDll, _ulDataInDll |
_ulDataInDll |
DATA |
_imp_ulDataInDll |
_ulDataInDll |
Usar __declspec(dllimport) e CONSTANT listará a versão imp e o nome não decorado na biblioteca de importação .lib DLL criada para permitir a vinculação explícita. Usar __declspec(dllimport) e DATA listarão apenas a versão imp do nome.
Se você usar CONSTANT, qualquer uma das seguintes construções de código poderá 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 no 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 adicional de indireção, poderá acessar o ponteiro da tabela de endereços de importação para a variável — não a própria variável. Esse tipo de problema geralmente pode se manifestar como uma violação de acesso porque a tabela de endereços de importação é atualmente somente leitura pelo compilador e vinculador.
O vinculador atual do Microsoft C++ (MSVC) gera um aviso ao detectar CONSTANT no arquivo .def, levando em conta esse caso. A única razão real para usar CONSTANT é se não for possível recompilar algum arquivo de objeto onde o arquivo de cabeçalho não listou __declspec(dllimport) no protótipo.