Run-Time Dynamische Verknüpfung

Wenn die Anwendung die Funktionen LoadLibrary oder LoadLibraryEx aufruft, versucht das System, die DLL zu suchen (weitere Informationen finden Sie unter Dynamic-Link Library Search Order). Wenn die Suche erfolgreich ist, ordnet das System das DLL-Modul dem virtuellen Adressraum des Prozesses zu und erhöht die Verweisanzahl. Wenn der Aufruf von LoadLibrary oder LoadLibraryEx eine DLL angibt, deren Code bereits dem virtuellen Adressraum des aufrufenden Prozesses zugeordnet ist, gibt die Funktion einfach ein Handle an die DLL zurück und erhöht die DLL-Verweisanzahl. Beachten Sie, dass zwei DLLs, die denselben Basisdateinamen und die gleiche Erweiterung haben, sich jedoch in verschiedenen Verzeichnissen befinden, nicht als dieselbe DLL angesehen werden.

Das System ruft die Einstiegspunktfunktion im Kontext des Threads auf, der LoadLibrary oder LoadLibraryEx aufgerufen hat. Die Einstiegspunktfunktion wird nicht aufgerufen, wenn die DLL bereits vom Prozess über einen Aufruf von LoadLibrary oder LoadLibraryEx ohne entsprechenden Aufruf der FreeLibrary-Funktion geladen wurde.

Wenn das System die DLL nicht finden kann oder die Einstiegspunktfunktion FALSE zurückgibt, gibt LoadLibrary oder LoadLibraryEx NULL zurück. Wenn LoadLibrary oder LoadLibraryEx erfolgreich ist, wird ein Handle an das DLL-Modul zurückgegeben. Der Prozess kann dieses Handle verwenden, um die DLL in einem Aufruf der Funktion GetProcAddress, FreeLibrary oder FreeLibraryAndExitThread zu identifizieren.

Die GetModuleHandle-Funktion gibt ein Handle zurück, das in GetProcAddress, FreeLibrary oder FreeLibraryAndExitThread verwendet wird. Die GetModuleHandle-Funktion ist nur erfolgreich, wenn das DLL-Modul bereits dem Adressraum des Prozesses durch Ladezeitverknüpfung oder durch einen vorherigen Aufruf von LoadLibrary oder LoadLibraryEx zugeordnet ist. Im Gegensatz zu LoadLibrary oder LoadLibraryEx erhöht GetModuleHandle die Modulverweisanzahl nicht. Die GetModuleFileName-Funktion ruft den vollständigen Pfad des Moduls ab, das einem handle zugeordnet ist, das von GetModuleHandle, LoadLibrary oder LoadLibraryEx zurückgegeben wird.

Der Prozess kann GetProcAddress verwenden, um die Adresse einer exportierten Funktion in der DLL mithilfe eines DLL-Modulhandles abzurufen, das von LoadLibrary oder LoadLibraryEx, GetModuleHandle zurückgegeben wird.

Wenn das DLL-Modul nicht mehr benötigt wird, kann der Prozess FreeLibrary oder FreeLibraryAndExitThread aufrufen. Diese Funktionen verringern die Anzahl der Modulverweis und heben die Zuordnung des DLL-Codes aus dem virtuellen Adressraum des Prozesses auf, wenn die Verweisanzahl null ist.

Durch die dynamische Laufzeitverknüpfung kann der Prozess auch dann fortgesetzt werden, wenn keine DLL verfügbar ist. Der Prozess kann dann eine alternative Methode verwenden, um sein Ziel zu erreichen. Wenn ein Prozess beispielsweise keine DLL finden kann, kann er versuchen, eine andere zu verwenden, oder er kann den Benutzer über einen Fehler benachrichtigen. Wenn der Benutzer den vollständigen Pfad der fehlenden DLL angeben kann, kann der Prozess diese Informationen verwenden, um die DLL zu laden, obwohl sie sich nicht im normalen Suchpfad befindet. Diese Situation steht im Gegensatz zur Ladezeitverknüpfung, bei der das System den Prozess einfach beendet, wenn die DLL nicht gefunden werden kann.

Die dynamische Verknüpfung zur Laufzeit kann Probleme verursachen, wenn die DLL die DllMain-Funktion verwendet, um die Initialisierung für jeden Thread eines Prozesses durchzuführen, da der Einstiegspunkt nicht für Threads aufgerufen wird, die vor dem Aufruf von LoadLibrary oder LoadLibraryEx vorhanden waren. Ein Beispiel zur Behandlung dieses Problems finden Sie unter Verwenden des lokalen Threadspeichers in einer Dynamic-Link Bibliothek.

Verwenden der dynamischen Laufzeitverknüpfung