Freigeben über


Informationen zu Dynamic-Link Bibliotheken

Mit dynamischer Verknüpfung kann ein Modul nur die Informationen einschließen, die zum Suchen einer exportierten DLL-Funktion zur Ladezeit oder Laufzeit erforderlich sind. Dynamische Verknüpfung unterscheidet sich von der vertrauten statischen Verknüpfung, bei der der Linker den Code einer Bibliotheksfunktion in jedes Modul kopiert, das sie aufruft.

Typen dynamischer Verknüpfungen

Es gibt zwei Methoden zum Aufrufen einer Funktion in einer DLL:

  • In der dynamischen Verknüpfung mit Ladezeiten führt ein Modul explizite Aufrufe exportierter DLL-Funktionen aus, als ob es sich um lokale Funktionen handelte. Dazu müssen Sie das Modul mit der Importbibliothek für die DLL verknüpfen, die die Funktionen enthält. Eine Importbibliothek stellt das System mit den Informationen bereit, die zum Laden der DLL und zum Suchen der exportierten DLL-Funktionen erforderlich sind, wenn die Anwendung geladen wird.
  • Bei dynamischer Laufzeitverknüpfung verwendet ein Modul die LoadLibrary - oder LoadLibraryEx-Funktion , um die DLL zur Laufzeit zu laden. Nachdem die DLL geladen wurde, ruft das Modul die GetProcAddress-Funktion auf, um die Adressen der exportierten DLL-Funktionen abzurufen. Das Modul ruft die exportierten DLL-Funktionen mithilfe der von GetProcAddress zurückgegebenen Funktionszeiger auf. Dadurch entfällt die Notwendigkeit einer Importbibliothek.

DLLs und Arbeitsspeicherverwaltung

Jeder Prozess, der die DLL lädt, ordnet sie dem virtuellen Adressraum zu. Nachdem der Prozess die DLL in die virtuelle Adresse geladen hat, kann er die exportierten DLL-Funktionen aufrufen.

Das System verwaltet eine Referenzanzahl pro Prozess für jede DLL. Wenn ein Thread die DLL lädt, wird die Verweisanzahl um eins erhöht. Wenn der Prozess beendet wird oder die Verweisanzahl 0 ist (nur dynamische Laufzeitverknüpfung), wird die DLL aus dem virtuellen Adressraum des Prozesses entladen.

Wie jede andere Funktion wird eine exportierte DLL-Funktion im Kontext des Threads ausgeführt, der sie aufruft. Daher gelten die folgenden Bedingungen:

  • Die Threads des Prozesses, der die DLL aufgerufen hat, können Von einer DLL-Funktion geöffnete Handles verwenden. Ebenso können Handles, die von einem beliebigen Thread des aufrufenden Prozesses geöffnet werden, in der DLL-Funktion verwendet werden.
  • Die DLL verwendet den Stapel des aufrufenden Threads und den virtuellen Adressraum des aufrufenden Prozesses.
  • Die DLL weist Arbeitsspeicher aus dem virtuellen Adressraum des aufrufenden Prozesses zu.

Weitere Informationen zu DLLs finden Sie in den folgenden Themen: