Importowanie plików DEF
Jeśli wybrano używanie __declspec(dllimport) wraz z pliku .def, należy zmienić pliku .def wykorzystanie danych, zamiast stałej, aby zmniejszyć prawdopodobieństwo, że nieprawidłowe kodowanie, spowoduje problem:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
W poniższej tabeli przedstawiono dlaczego.
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 biblioteki DLL Importowanie biblioteki, utworzonej w celu umożliwienia jawnego łączenia.Za pomocą __declspec(dllimport) i wykazy danych tylko na imp wersji nazwy.
Użycie stałej, albo następujące konstrukcje kodu może służyć do dostępu ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L) /*sample code fragment*/
- lub -
ULONG *ulDataInDll; /*prototype*/
if (*ulDataInDll == 0L) /*sample code fragment*/
Jednak użycie danych w pliku .def, tylko kod skompilowany z następującej definicji można uzyskać dostęp zmiennej ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L) /*sample code fragment*/
Używając stałej jest bardziej ryzykowne, ponieważ Jeżeli zapomnisz dodatkowy poziom pośrednia, mógłby potencjalnie dostęp tabele adresów importu wskaźnik do zmiennej — nie zmiennej.Ten typ problemu często może objawiać jako naruszenie zasad dostępu, ponieważ tabele adresów importu jest obecnie tylko do odczytu przez kompilator i program łączący.
Bieżący program Visual C++ łączący odpowiednie ostrzeżenie, jeśli STAŁA w pliku .def dla tej sprawy.Tylko ważny powód, aby użyć stałej jest, jeśli nie można ponownie skompilować niektóre obiektu pliku, gdzie nie wykaz did pliku nagłówka __declspec(dllimport) na prototypu.