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 Ordre de recherche de bibliothèque de liens dynamiques). 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 la même 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 qui a 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 à la fonction GetProcAddress, FreeLibrary ou FreeLibraryAndExitThread .
La fonction GetModuleHandle retourne un handle utilisé dans GetProcAddress, FreeLibrary ou 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 moment du 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 d’accès complet du module associé à un handle retourné par GetModuleHandle, LoadLibrary ou 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 de module et annulent le mappage du code DLL 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 parvient pas à localiser une DLL, il peut essayer d’en utiliser une autre, ou il peut informer 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 ne figure pas dans le chemin de recherche normal. Cette situation contraste avec la liaison au moment du chargement, dans laquelle le système termine simplement le 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 fonction DllMain pour effectuer l’initialisation de chaque thread d’un processus, car le point d’entrée n’est pas appelé pour les threads qui existaient avant l’appel de LoadLibrary ou LoadLibraryEx . Pour obtenir un exemple montrant comment résoudre ce problème, consultez Utilisation du stockage local de threads dans une bibliothèque Dynamic-Link.
Rubriques connexes