Comment décharger correctement une DLL de tous les processus lorsque le hook qui les a chargés est déchargé?Déchargement de la DLL de tous les processus après le décrochage du hook global CBT
De MSDN:
Vous pouvez libérer une procédure crochet global en utilisant UnhookWindowsHookEx, mais cette fonction ne libère pas la DLL contenant la procédure de crochet . Cela est dû au fait que les procédures de hook globales sont appelées dans le contexte de processus de chaque application sur le bureau, entraînant un appel implicite à la fonction LoadLibrary pour tous ces processus. Parce qu'un appel à la fonction FreeLibrary ne peut pas être effectué pour un autre processus, il est puis aucun moyen de libérer la DLL. Le système libère éventuellement la DLL après tous les processus explicitement liés à la DLL ont soit terminé ou appelé FreeLibrary et tous les processus qui méthode dite de la crochet ont repris le traitement en dehors de la DLL.
Ce que je cherche, est une méthode pour détecter lorsque le crochet est décrocha, puis appelez FreeLibrary
de tous les processus qui ont été accrochés. Existe-t-il d'autres moyens pour provoquer le déchargement instantané d'une DLL lorsque le hook est déchargé?
Voulez-vous dire qu'une DLL déjà chargée peut être renommée à la volée? Ou que ma nouvelle version d'une DLL devrait prendre la place de l'ancienne seulement après un redémarrage? –
Oui, toute DLL chargée peut être renommée à la volée. Essayez juste ceci. C'est un truc très ancien existant depuis Windows NT 3.1. Certaines installations modernes comme Windows Installer l'ont utilisé d'ailleurs. Vous avez dans la plupart des cas un avantage si vous déplacez et renommez l'ancienne DLL (qui peut être utilisée) dans un répertoire temporaire avec le nom temporaire et copiez une nouvelle version de DLL dans le nouvel emplacement. Les programmes qui ont chargé l'ancienne DLL peuvent continuer à fonctionner, mais vous pouvez utiliser une nouvelle DLL sans attendre le redémarrage.Le seul problème qui peut exister si vous avez beaucoup de DLL qui peut être chargé dynamiquement et dans le cas où vous pouvez avoir un mélange de DLL – Oleg
Pourriez-vous expliquer pourquoi vous avez besoin de décharger la DLL dans votre cas? – Oleg