Udostępnij za pośrednictwem


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.

Zobacz też

Koncepcje

Importowanie do aplikacji