Importowanie przy użyciu plików DEF
Jeśli zdecydujesz się używać __declspec(dllimport) wraz z pliku o rozszerzeniu def, należy zmienić plik o rozszerzeniu def do używania danych zamiast stałej Aby zmniejszyć prawdopodobieństwo, że nieprawidłowe kodowanie spowoduje, że problem:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
W poniższej tabeli przedstawiono przyczyny.
Słowo kluczowe |
Emituje w bibliotece importu |
Wywóz |
---|---|---|
CONSTANT |
_imp_ulDataInDll_ulDataInDll |
_ulDataInDll |
DATA |
_imp_ulDataInDll |
_ulDataInDll |
Za pomocą __declspec(dllimport) i stałej listy zarówno imp wersji i bez nazwy w .lib DLL zaimportować bibliotekę, w której jest tworzona pozwalające na wyraźne powiązanie.Za pomocą __declspec(dllimport) i listy danych tylko imp wersja nazwy.
Jeśli używasz STAŁA, albo następujące konstrukcje kodu mogą być używane do dostępu do ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L) /*sample code fragment*/
-lub-
ULONG *ulDataInDll; /*prototype*/
if (*ulDataInDll == 0L) /*sample code fragment*/
Jednak jeśli używasz danych w pliku o rozszerzeniu def, tylko kod skompilowany z następującą definicję można uzyskać dostęp do zmiennej ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L) /*sample code fragment*/
Używając stałej jest bardziej ryzykowne, ponieważ Jeśli zapomnisz dodatkowy poziom pośredni, wskaźnik tabeli Adres importu do zmiennej może potencjalnie dostępu — nie samej zmiennej.Ten typ problemu często może objawiać jako naruszenie zasad dostępu, ponieważ tabela adres importu obecnie składa tylko do odczytu przez kompilator i linker.
Bieżący program Visual C++ łączący wygeneruje ostrzeżenie, jeśli widzi STAŁA w pliku o rozszerzeniu def do konta dla tej sprawy.Jedynym powodem do stałej jest, jeśli nie można ponownie skompilować jakiś plik obiektu, gdzie pliku nagłówka nie lista __declspec(dllimport) na prototyp.