Importando usando arquivos DEF
Se você optar por usar __declspec(DllImport) juntamente com um arquivo .def, você deve alterar o arquivo .def para usar dados no lugar da constante para reduzir a probabilidade de que a codificação incorreta fará com que um problema:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
A tabela a seguir mostra por que.
Keyword |
Emite na biblioteca de importação |
Exportações |
---|---|---|
CONSTANT |
_imp_ulDataInDll_ulDataInDll |
_ulDataInDll |
DATA |
_imp_ulDataInDll |
_ulDataInDll |
Usando __declspec(DllImport) e constante relaciona o imp versão e o nome não decorado na DLL a .lib importar biblioteca que é criada para permitir explícita de vinculação. Usando __declspec(DllImport) e dados lista apenas o imp versão do nome.
Se você usar a constante, uma das seguintes construções de código pode ser usada para acesso 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 dados em seu arquivo .def, somente código compilado com a seguinte definição possível acesso a variável ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L) /*sample code fragment*/
O uso constante é mais arriscado porque se você esquecer de usar o nível extra de indireção, você poderia acessar potencialmente ponteiro da tabela de endereço de importação para a variável — não a variável.Esse tipo de problema freqüentemente pode se manifestar sistema autônomo uma violação de acesso porque a tabela de importação de endereços no momento é feita somente leitura pelo compilador e vinculador.
O vinculador Visual C++ corrente emitirá um aviso se vir constante no arquivo .def para esse caso.O motivo real somente usar constante é se você não pode recompilar algum arquivo de objeto onde o arquivo de cabeçalho não listar __declspec(DllImport) no protótipo.