Delen via


Importeren met BEHULP van DEF-bestanden

Als u ervoor kiest om samen met een .def-bestand te gebruiken __declspec(dllimport) , moet u het .def-bestand wijzigen om GEGEVENS te gebruiken in plaats van CONSTANT om de kans te verkleinen dat onjuiste codering een probleem veroorzaakt:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

In de volgende tabel ziet u waarom.

Trefwoord Emitteert in de importbibliotheek Exporten
CONSTANT _imp_ulDataInDll, _ulDataInDll _ulDataInDll
DATA _imp_ulDataInDll _ulDataInDll

Met behulp van __declspec(dllimport) en CONSTANT worden zowel de imp versie als de ongemarkeerde naam weergegeven in de .lib DLL-importbibliotheek die is gemaakt om uitdrukkelijke koppeling mogelijk te maken. Met behulp van __declspec(dllimport) en DATA wordt alleen de imp versie van de naam vermeld.

Als u CONSTANT gebruikt, kunt u een van de volgende codeconstructies gebruiken om toegang te krijgen tot ulDataInDll:

__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L)   /*sample code fragment*/

– of –

ULONG *ulDataInDll;      /*prototype*/
if (*ulDataInDll == 0L)  /*sample code fragment*/

Als u ECHTER DATA in uw .def-bestand gebruikt, heeft alleen code die is gecompileerd met de volgende definitie toegang tot de variabele ulDataInDll:

__declspec(dllimport) ULONG ulDataInDll;

if (ulDataInDll == 0L)   /*sample code fragment*/

Het gebruik van CONSTANT is riskanter omdat als u vergeet het extra indirectieniveau te gebruiken, u mogelijk toegang hebt tot de aanwijzer van de importadrestabel naar de variabele, niet naar de variabele zelf. Dit type probleem kan vaak optreden als een schending van toegang omdat de importadrestabel momenteel alleen-lezen wordt gemaakt door de compiler en linker.

Met de huidige Microsoft C++ (MSVC)-linker wordt een waarschuwing weergegeven als CONSTANT in het .def-bestand wordt gevonden om met dit geval rekening te houden. De enige echte reden om CONSTANT te gebruiken, is als u een objectbestand niet opnieuw kunt compileren waarbij het headerbestand niet op het prototype werd vermeld __declspec(dllimport) .

Zie ook

Importeren in een toepassing