Si j'utilise l'API Win32 LoadLibrary pour charger la même DLL 3 fois de suite, elle doit renvoyer 3 handles distincts et les fonctions de chaque bibliothèque doivent toutes avoir des adresses différentes correctes? (Ou fait-il quelque chose de "intelligent" et détecte si la DLL a déjà été chargée pour le processus et pointe simplement vers le même module?)Est-ce que LoadLibrary crée des instances distinctes?
Répondre
Il fait quelque chose d'intelligent. Windows conserve un nombre de références pour chaque DLL chargée via LoadLibrary. C'est pourquoi vous devez appeler FreeLibrary une fois pour chaque appel LoadLibrary correspondant. En supposant que vous ne libérez pas la DLL en premier, chaque appel à LoadLibrary vous donnera le même handle.
De la documentation MSDN pour FreeLibrary:
Chaque processus maintient un compte de référence pour chaque module de bibliothèque chargée. Ce nombre de références est incrémenté chaque fois que LoadLibrary est appelé et est décrémenté chaque fois que FreeLibrary est appelée.
S'il s'agit de la même DLL, il ne la chargera plus.
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
« Si le module spécifié est une DLL qui est pas déjà chargé pour le processus d'appel, le système appelle la fonction DllMain avec la valeur DLL_PROCESS_ATTACH de la DLL. Si retourne DllMain TRUE, LoadLibrary retourne une poignée à la Si DllMain renvoie la valeur FALSE, le système décharge la DLL de l'espace adresse du processus et LoadLibrary renvoie la valeur NULL Il n'est pas prudent d'appeler LoadLibrary à partir de DllMain Pour plus d'informations, voir la section Remarques dans DllMain. "
"Si lpFileName n'inclut pas de chemin et qu'il existe plusieurs modules chargés avec le même nom de base et la même extension, la fonction retourne un handle au module qui a été chargé en premier."
Non, ce n'est pas le cas. Pour contourner ce problème, vous pouvez copier le fichier .dll dans un fichier temporaire (autant de fois que nécessaire pour charger le fichier .dll), puis supprimer les fichiers une fois que vous avez terminé.
Notez qu'il est possible d'obtenir plusieurs instances si vous utilisez différents chemins de résolution vers la même DLL, mais la plupart des gens ne rencontrent pas cela. – Michael
Bonne prise. Merci, Michael. –
Ma politique générale est de ne jamais appeler FreeLibrary. Il est bon de savoir que l'utilisateur peut ainsi appeler LoadLibrary plusieurs fois sur le même sans fuir plus que nécessaire. (À quelle fréquence voulez-vous vraiment décharger la bibliothèque avant la fin de l'application? Le risque est supérieur à la valeur). – CashCow