Freigeben über


dynamische Verknüpfung Run-Time

Wenn die Anwendung die funktionen LoadLibrary oder LoadLibraryEx aufruft, versucht das System, die DLL zu finden (Details finden Sie unter Dynamic-Link Bibliothekssuchreihenfolge). Wenn die Suche erfolgreich ist, ordnet das System das DLL-Modul dem virtuellen Adressraum des Prozesses zu und erhöht die Referenzanzahl. 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 aufweisen, aber in verschiedenen Verzeichnissen gefunden werden, nicht als die gleiche DLL betrachtet 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 geladen wurde, ohne den entsprechenden Aufruf der FreeLibrary-Funktion.

Wenn das System die DLL nicht finden kann oder wenn 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 des GetProcAddress, FreeLibraryoder FreeLibraryAndExitThread Funktion zu identifizieren.

Die GetModuleHandle-funktion gibt einen Handle zurück, der in GetProcAddress, FreeLibraryoder FreeLibraryAndExitThreadverwendet wird. Die GetModuleHandle--Funktion ist nur erfolgreich, wenn das DLL-Modul bereits dem Adressraum des Prozesses zugeordnet ist, indem eine Ladezeitverknüpfung oder ein vorheriger Aufruf von LoadLibrary oder LoadLibraryEx. 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, LoadLibraryoder LoadLibraryExzurü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, GetModuleHandlezurückgegeben wird.

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

Mit dynamischer Laufzeitverknüpfung kann der Prozess fortgesetzt werden, auch wenn eine DLL nicht 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 bereitstellen kann, kann der Prozess diese Informationen verwenden, um die DLL zu laden, obwohl sie sich nicht im normalen Suchpfad befindet. Diese Situation unterscheidet sich von der Ladezeitverknüpfung, bei der das System den Prozess einfach beendet, wenn die DLL nicht gefunden werden kann.

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

Verwenden der dynamischen Laufzeitverknüpfung