liaison dynamique Run-Time
Lorsque l’application appelle les fonctions LoadLibrary ou LoadLibraryEx, le système tente de localiser la DLL (pour plus d’informations, consultez Dynamic-Link ordre de recherche de bibliothèque). Si la recherche réussit, le système mappe le module DLL dans l’espace d’adressage virtuel du processus et incrémente le nombre de références. Si l’appel à LoadLibrary ou LoadLibraryEx spécifie une DLL dont le code est déjà mappé dans l’espace d’adressage virtuel du processus appelant, la fonction retourne simplement un handle à la DLL et incrémente le nombre de références DLL. Notez que deux DLL qui ont le même nom de fichier de base et l’extension, mais qui se trouvent dans des répertoires différents ne sont pas considérées comme étant la même DLL.
Le système appelle la fonction de point d’entrée dans le contexte du thread appelé LoadLibrary ou LoadLibraryEx. La fonction de point d’entrée n’est pas appelée si la DLL a déjà été chargée par le processus via un appel à LoadLibrary ou LoadLibraryEx sans appel correspondant à la fonction FreeLibrary.
Si le système ne trouve pas la DLL ou si la fonction de point d’entrée retourne FALSE, LoadLibrary ou LoadLibraryEx retourne NULL. Si LoadLibrary ou LoadLibraryEx réussit, il retourne un handle au module DLL. Le processus peut utiliser ce handle pour identifier la DLL dans un appel à l'GetProcAddress, FreeLibraryou Fonction FreeLibraryAndExitThread.
La fonction GetModuleHandle retourne un handle utilisé dans GetProcAddress, FreeLibraryou FreeLibraryAndExitThread. La fonction GetModuleHandle réussit uniquement si le module DLL est déjà mappé dans l’espace d’adressage du processus par liaison au temps de chargement ou par un appel précédent à LoadLibrary ou LoadLibraryEx. Contrairement à LoadLibrary ou LoadLibraryEx, GetModuleHandle n’incrémente pas le nombre de références de module. La fonction GetModuleFileName récupère le chemin complet du module associé à un handle retourné par GetModuleHandle, LoadLibraryou LoadLibraryEx.
Le processus peut utiliser GetProcAddress pour obtenir l’adresse d’une fonction exportée dans la DLL à l’aide d’un handle de module DLL retourné par LoadLibrary ou LoadLibraryEx, GetModuleHandle.
Lorsque le module DLL n’est plus nécessaire, le processus peut appeler FreeLibrary ou FreeLibraryAndExitThread. Ces fonctions décrémentent le nombre de références du module et annulent le mappage du code DLL à partir de l’espace d’adressage virtuel du processus si le nombre de références est égal à zéro.
La liaison dynamique au moment de l’exécution permet au processus de continuer à s’exécuter même si une DLL n’est pas disponible. Le processus peut ensuite utiliser une autre méthode pour atteindre son objectif. Par exemple, si un processus ne peut pas localiser une DLL, il peut essayer d’utiliser un autre, ou il peut avertir l’utilisateur d’une erreur. Si l’utilisateur peut fournir le chemin complet de la DLL manquante, le processus peut utiliser ces informations pour charger la DLL même si elle n’est pas dans le chemin de recherche normal. Cette situation contraste avec la liaison au temps de chargement, dans laquelle le système met simplement fin au processus s’il ne trouve pas la DLL.
La liaison dynamique au moment de l’exécution peut entraîner des problèmes si la DLL utilise la fonctionDllMainpour effectuer l’initialisation pour chaque thread d’un processus, car le point d’entrée n’est pas appelé pour les threads qui existaient avant loadLibrary ou LoadLibraryEx. Pour obtenir un exemple montrant comment résoudre ce problème, consultez Utilisation du stockage local thread dans une bibliothèque Dynamic-Link.
Rubriques connexes