Delen via


Over Dynamic-Link bibliotheken

Met dynamische koppelingen kan een module alleen de informatie bevatten die nodig is om een geëxporteerde DLL-functie te vinden tijdens de laadtijd of runtime. Dynamische koppelingen verschillen van de bekendere statische koppeling, waarbij de linker de code van een bibliotheekfunctie kopieert naar elke module die deze aanroept.

Typen van dynamische koppelingen

Er zijn twee methoden voor het aanroepen van een functie in een DLL:

  • In dynamische koppelinglaadtijd maakt een module expliciete aanroepen naar geëxporteerde DLL-functies alsof het lokale functies zijn. Hiervoor moet u de module koppelen aan de importbibliotheek voor het DLL-bestand dat de functies bevat. Een importbibliotheek levert het systeem de informatie die nodig is om het DLL-bestand te laden en de geëxporteerde DLL-functies te vinden wanneer de toepassing wordt geladen.
  • In runtime dynamische koppelinggebruikt een module de functie LoadLibrary of LoadLibraryEx om het DLL-bestand tijdens runtime te laden. Nadat het DLL-bestand is geladen, roept de module de GetProcAddress--functie aan om de adressen van de geëxporteerde DLL-functies op te halen. De module roept de geëxporteerde DLL-functies aan met behulp van de functieaanwijzers die worden geretourneerd door GetProcAddress-. Hierdoor hoeft u geen importbibliotheek meer te maken.

DLL's en geheugenbeheer

Elk proces dat de DLL laadt, map het in zijn virtuele adresruimte. Nadat het proces het DLL-bestand in het virtuele adres heeft geladen, kan het de geëxporteerde DLL-functies aanroepen.

Het systeem onderhoudt een referentieaantal per proces voor elke DLL. Wanneer een thread het DLL-bestand laadt, wordt het aantal verwijzingen met één verhoogd. Wanneer het proces wordt beëindigd of wanneer het verwijzingsaantal nul wordt (alleen dynamische runtimekoppeling), wordt het DLL-bestand uit de virtuele adresruimte van het proces verwijderd.

Net als elke andere functie wordt een geëxporteerde DLL-functie uitgevoerd in de context van de thread die deze aanroept. Daarom zijn de volgende voorwaarden van toepassing:

  • De threads van het proces dat de DLL heeft aangeroepen, kunnen handles gebruiken die door een DLL-functie worden geopend. ** Op dezelfde manier kunnen handles die door een willekeurige thread van het aanroepende proces zijn geopend, in de DLL-functie worden gebruikt.
  • Het DLL-bestand maakt gebruik van de stack van de aanroepende thread en de virtuele adresruimte van het aanroepende proces.
  • Het DLL-bestand wijst geheugen toe vanuit de virtuele adresruimte van het aanroepende proces.

Zie de volgende onderwerpen voor meer informatie over DLL's: