dynamické propojení Run-Time
Když aplikace volá LoadLibrary nebo LoadLibraryEx funkce, systém se pokusí najít knihovnu DLL (podrobnosti naleznete v tématu Dynamic-Link Pořadí hledání knihovny). Pokud hledání proběhne úspěšně, systém mapuje modul DLL do virtuálního adresního prostoru procesu a zvýší počet odkazů. Pokud volání LoadLibrary nebo LoadLibraryEx určuje knihovnu DLL, jejíž kód je již namapován do virtuálního adresního prostoru volajícího procesu, funkce jednoduše vrátí popisovač knihovny DLL a zvýší počet odkazů knihovny DLL. Všimněte si, že dvě knihovny DLL, které mají stejný základní název a příponu, ale nacházejí se v různých adresářích, nejsou považovány za stejné knihovny DLL.
Systém volá funkci vstupního bodu v kontextu vlákna, které se nazývá LoadLibrary nebo LoadLibraryEx. Vstupní funkce není volána, pokud knihovna DLL již byla načtena procesem prostřednictvím volání LoadLibrary nebo LoadLibraryEx bez odpovídajícího volání funkce FreeLibrary.
Pokud systém nemůže najít knihovnu DLL nebo pokud funkce vstupního bodu vrátí hodnotu FALSE, LoadLibrary nebo LoadLibraryEx vrátí hodnotu NULL. Pokud LoadLibrary nebo LoadLibraryEx úspěšně, vrátí popisovač modulu KNIHOVNY DLL. Tento popisovač může použít k identifikaci knihovny DLL ve volání GetProcAddress, FreeLibrarynebo FreeLibraryAndExitThread funkce.
Funkce GetModuleHandle vrátí popisovač použitý v GetProcAddress, FreeLibrarynebo FreeLibraryAndExitThread. Funkce GetModuleHandle bude úspěšná pouze v případě, že modul DLL je již namapován do adresního prostoru procesu propojením a předchozím voláním LoadLibrary nebo LoadLibraryEx. Na rozdíl od LoadLibrary nebo LoadLibraryEx, GetModuleHandle nezvýšuje počet odkazů modulu. Funkce GetModuleFileName načte úplnou cestu modulu přidruženého k popisovači vrácené GetModuleHandle, LoadLibrarynebo LoadLibraryEx.
Proces může použít GetProcAddress k získání adresy exportované funkce v knihovně DLL pomocí popisovače modulu DLL vráceného LoadLibrary nebo LoadLibraryEx, GetModuleHandle.
Pokud už modul DLL není potřeba, proces může volat FreeLibrary nebo FreeLibraryAndExitThread. Tyto funkce dekrementují počet odkazů modulu a zruší mapování kódu knihovny DLL z virtuálního adresního prostoru procesu, pokud je počet odkazů nulový.
Dynamické propojení za běhu umožňuje, aby proces pokračoval i v případě, že není k dispozici knihovna DLL. Proces pak může k dosažení cíle použít alternativní metodu. Pokud například proces nemůže najít jednu knihovnu DLL, může se pokusit použít jinou nebo může uživatele upozornit na chybu. Pokud uživatel může poskytnout úplnou cestu chybějící knihovny DLL, proces může tyto informace použít k načtení knihovny DLL, i když není v normální cestě hledání. Tato situace kontrastuje s propojením doby načítání, ve kterém systém jednoduše ukončí proces, pokud nemůže najít knihovnu DLL.
Dynamické propojení za běhu může způsobit problémy, pokud knihovna DLL používá funkci DllMain k provádění inicializace pro každé vlákno procesu, protože vstupní bod není volán pro vlákna, která existovala před LoadLibrary nebo LoadLibraryEx je volána. Příklad ukazující, jak tento problém vyřešit, najdete v tématu Použití místního úložiště vláken vknihovny Dynamic-Link .
Související témata