Partager via


À propos des bibliothèques Dynamic-Link

La liaison dynamique permet à un module d’inclure uniquement les informations nécessaires pour localiser une fonction DLL exportée au moment du chargement ou de l’exécution. La liaison dynamique diffère de la liaison statique plus familière, dans laquelle l’éditeur de liens copie le code d’une fonction de bibliothèque dans chaque module qui l’appelle.

Types de liaison dynamique

Il existe deux méthodes pour appeler une fonction dans une DLL :

  • Dans la liaison dynamique au moment du chargement, un module effectue des appels explicites aux fonctions DLL exportées comme s’il s’agissait de fonctions locales. Pour cela, vous devez lier le module à la bibliothèque d’importation pour la DLL qui contient les fonctions. Une bibliothèque d’importation fournit au système les informations nécessaires pour charger la DLL et localiser les fonctions DLL exportées lors du chargement de l’application.
  • Dans la liaison dynamique au moment de l’exécution, un module utilise la fonction LoadLibrary ou LoadLibraryEx pour charger la DLL au moment de l’exécution. Une fois la DLL chargée, le module appelle la fonction GetProcAddress pour obtenir les adresses des fonctions DLL exportées. Le module appelle les fonctions DLL exportées à l’aide des pointeurs de fonction retournés par GetProcAddress. Cela élimine la nécessité d’une bibliothèque d’importation.

DLL et gestion de la mémoire

Chaque processus qui charge la DLL la mappe dans son espace d’adressage virtuel. Une fois que le processus a chargé la DLL dans son adresse virtuelle, il peut appeler les fonctions DLL exportées.

Le système gère un nombre de références par processus pour chaque DLL. Lorsqu’un thread charge la DLL, le nombre de références est incrémenté d’un. Lorsque le processus se termine ou lorsque le nombre de références devient égal à zéro (liaison dynamique d’exécution uniquement), la DLL est déchargée de l’espace d’adressage virtuel du processus.

Comme toute autre fonction, une fonction DLL exportée s’exécute dans le contexte du thread qui l’appelle. Par conséquent, les conditions suivantes s’appliquent :

  • Les threads du processus qui a appelé la DLL peuvent utiliser des handles ouverts par une fonction DLL. De même, les handles ouverts par n’importe quel thread du processus appelant peuvent être utilisés dans la fonction DLL.
  • La DLL utilise la pile du thread appelant et l’espace d’adressage virtuel du processus appelant.
  • La DLL alloue de la mémoire à partir de l’espace d’adressage virtuel du processus appelant.

Pour plus d’informations sur les DLL, consultez les rubriques suivantes :