Dela via


Run-Time dynamisk länkning

När programmet anropar funktionerna LoadLibrary eller LoadLibraryEx försöker systemet hitta DLL-filen (mer information finns i Dynamic-Link Sökordning för bibliotek). Om sökningen lyckas mappar systemet DLL-modulen till processens virtuella adressutrymme och ökar referensantalet. Om anropet till LoadLibrary eller LoadLibraryEx anger en DLL vars kod redan har mappats till det virtuella adressutrymmet i anropsprocessen, returnerar funktionen helt enkelt en referens till DLL och ökar DLL-referensantalet. Observera att två DLL:er som har samma basfilnamn och filnamnstillägg men som finns i olika kataloger inte anses vara samma DLL.

Systemet anropar startpunktsfunktionen i kontexten för tråden som anropade LoadLibrary eller LoadLibraryEx. Startpunktsfunktionen anropas inte om DLL-filen redan har lästs in av processen via ett anrop till LoadLibrary eller LoadLibraryEx utan motsvarande anrop till funktionen FreeLibrary.

Om systemet inte kan hitta DLL eller om startpunktsfunktionen returnerar FALSE returnerar LoadLibrary eller LoadLibraryEx NULL. Om LoadLibrary eller LoadLibraryEx lyckas returneras en referens till DLL-modulen. Processen kan använda det här handtaget för att identifiera DLL i ett anrop till funktionen GetProcAddress, FreeLibraryeller FreeLibraryAndExitThread.

Funktionen GetModuleHandle returnerar ett handtag som används i GetProcAddress, FreeLibraryeller FreeLibraryAndExitThread. Funktionen GetModuleHandle lyckas bara om DLL-modulen redan är mappad till processens adressutrymme genom att ladda tidslänkning eller av ett tidigare anrop till LoadLibrary eller LoadLibraryEx. Till skillnad från LoadLibrary eller LoadLibraryExökar inte GetModuleHandle antalet modulreferenser. Funktionen GetModuleFileName hämtar den fullständiga sökvägen för modulen som är associerad med en referens som returneras av GetModuleHandle, LoadLibraryeller LoadLibraryEx.

Processen kan använda GetProcAddress för att hämta adressen till en exporterad funktion i DLL med hjälp av en DLL-modulreferens som returneras av LoadLibrary eller LoadLibraryEx, GetModuleHandle.

När DLL-modulen inte längre behövs kan processen anropa FreeLibrary eller FreeLibraryAndExitThread. Dessa funktioner minskar antalet modulreferenser och avmappar DLL-koden från processens virtuella adressutrymme om referensantalet är noll.

Dynamisk länkning vid körning gör att processen kan fortsätta köras även om en DLL inte är tillgänglig. Processen kan sedan använda en alternativ metod för att uppnå målet. Om en process till exempel inte kan hitta en DLL kan den försöka använda en annan eller meddela användaren om ett fel. Om användaren kan ange den fullständiga sökvägen för den saknade DLL-filen kan processen använda den här informationen för att läsa in DLL-filen även om den inte finns i den normala sökvägen. Den här situationen står i kontrast till belastningslänkning, där systemet helt enkelt avslutar processen om den inte hittar DLL:en.

Dynamisk körningslänkning kan orsaka problem om DLL:n använder funktionen DllMain för att utföra initiering för varje tråd i en process, eftersom startpunkten inte anropas för trådar som fanns före LoadLibrary- eller LoadLibraryEx anropas. Ett exempel som visar hur du hanterar det här problemet finns i Using Thread Local Storage in a Dynamic-Link Library.

Med dynamisk länkning