Delen via


dynamische koppelingen Run-Time

Wanneer de toepassing de functies LoadLibrary of LoadLibraryEx aanroept, probeert het systeem het DLL-bestand te vinden (zie Dynamic-Link Bibliotheekzoekvolgordevoor meer informatie). Als het zoeken slaagt, wijst het systeem de DLL-module toe aan de virtuele adresruimte van het proces en wordt het aantal verwijzingen verhoogd. Als de aanroep naar LoadLibrary of LoadLibraryEx een DLL opgeeft waarvan de code al is toegewezen aan de virtuele adresruimte van het aanroepende proces, retourneert de functie gewoon een ingang naar het DLL-bestand en wordt het aantal DLL-verwijzingen verhoogd. Houd er rekening mee dat twee DLL's met dezelfde basisbestandsnaam en -extensie, maar in verschillende mappen worden gevonden, niet als dezelfde DLL worden beschouwd.

Het systeem roept de invoerpuntfunctie aan in de context van de thread met de naam LoadLibrary of LoadLibraryEx. De invoerpuntfunctie wordt niet aangeroepen als het DLL-bestand al door het proces is geladen via een aanroep naar LoadLibrary- of LoadLibraryEx zonder bijbehorende aanroep van de FreeLibrary- functie.

Als het systeem het DLL-bestand niet kan vinden of als de invoerpuntfunctie FALSE retourneert, retourneert LoadLibrary of LoadLibraryEx NULL. Als LoadLibrary of LoadLibraryEx slaagt, wordt er een ingang geretourneerd naar de DLL-module. Het proces kan deze ingang gebruiken om het DLL-bestand te identificeren in een aanroep naar de GetProcAddress-, FreeLibraryof FreeLibraryAndExitThread functie.

De functie GetModuleHandle retourneert een ingang die wordt gebruikt in GetProcAddress-, FreeLibrary-of FreeLibraryAndExitThread-. De functie GetModuleHandle slaagt alleen als de DLL-module al is toegewezen aan de adresruimte van het proces door de laadtijd te koppelen of door een eerdere aanroep naar LoadLibrary- of LoadLibraryEx. In tegenstelling tot LoadLibrary of LoadLibraryEx, wordt GetModuleHandle- het aantal moduleverwijzingen niet verhoogd. De functie GetModuleFileName haalt het volledige pad op van de module die is gekoppeld aan een ingang die wordt geretourneerd door GetModuleHandle-, LoadLibrary-of LoadLibraryEx.

Het proces kan GetProcAddress- gebruiken om het adres van een geëxporteerde functie in het DLL-bestand op te halen met behulp van een DLL-modulegreep die wordt geretourneerd door LoadLibrary- of LoadLibraryEx, GetModuleHandle-.

Wanneer de DLL-module niet meer nodig is, kan het proces FreeLibrary- of FreeLibraryAndExitThreadaanroepen. Deze functies verlagen het aantal moduleverwijzingen en ontkoppelen de DLL-code uit de virtuele adresruimte van het proces als het aantal verwijzingen nul is.

Met dynamische runtimekoppeling kan het proces blijven worden uitgevoerd, zelfs als er geen DLL beschikbaar is. Het proces kan vervolgens een alternatieve methode gebruiken om het doel ervan te bereiken. Als een proces bijvoorbeeld geen DLL kan vinden, kan het proberen een ander DLL-bestand te gebruiken of de gebruiker op de hoogte stellen van een fout. Als de gebruiker het volledige pad van het ontbrekende DLL-bestand kan opgeven, kan het proces deze informatie gebruiken om het DLL-bestand te laden, ook al bevindt deze zich niet in het normale zoekpad. Deze situatie contrasteert met het koppelen van laadtijd, waarbij het systeem het proces eenvoudig beëindigt als het DLL-bestand niet kan worden gevonden.

Dynamische run-timekoppeling kan problemen veroorzaken als het DLL-bestand de functie DllMain gebruikt om initialisatie uit te voeren voor elke thread van een proces, omdat het toegangspunt niet wordt aangeroepen voor threads die bestonden vóór LoadLibrary- of LoadLibraryEx- wordt aangeroepen. Zie Thread Local Storage gebruiken in een Dynamic-Link Bibliotheekvoor een voorbeeld van hoe u dit probleem kunt oplossen.

Uitvoeren van dynamische koppelingen gebruiken