2010-11-04 25 views
0

J'ai fait un outil simple (LogAndMailApplication) qui envoie des journaux à mon compte gmail, pour cela j'ai utilisé le composant Indy TIdSSLIOHandlerSocketOpenSSL. Pour fonctionner, il a besoin de ssleay32.dll et de libeay32.dll.Comment faire pour supprimer openssl dll avant de fermer l'application

Ainsi, au démarrage de l'application, j'extrais des ressources exe les 2 dll et je les copie dans le dossier de l'application.

Tous les composants indy sont dans un datamodule que je détruis avant de fermer l'application. Après la destruction du datamodule, j'essaye de supprimer les dll mais je ne peux pas. J'ai juste utilisé DeleteFile, mais cela a bien fonctionné pour tous les autres fichiers que je supprime à la sortie de l'application (y compris un fichier ini).

J'ai essayé de faire un simple exe qui supprime juste le 2 dll et cela fonctionne. Donc, le problème est que les 2 DLL sont en quelque sorte verrouillés jusqu'à ce que le LogAndMailApplication n'est pas fermé, comment résoudre le problème?

+0

si les DLL sont cachés dans le fichier exécutable, comment les utilisateurs ou les administrateurs de remplacer les DLL par une version plus récente, si elles ont besoin un correctif de sécurité critique? – mjn

+0

Ils ne peuvent pas, mais ce n'est pas quelque chose qui a du sens ici. Je viens de m'envoyer un e-mail. Je l'installe sur 3 clients seulement, donc pour l'instant c'est gérable. – LaBracca

+0

Pourquoi avez-vous besoin de supprimer les DLL du tout? Pourquoi ne pas les garder dans le répertoire de l'application pour qu'ils soient prêts à utiliser la prochaine fois? (Et d'ailleurs, pourquoi ne faites-vous pas simplement le * installateur * les mettre là?) –

Répondre

3

Vous pouvez effectuer les opérations suivantes: à la fin de l'utilisation de code

FreeLibrary (GetModuleHandle ('ssleay32.dll')); FreeLibrary (GetModuleHandle ('libeay32.dll')); DeleteFile (PathToDLL1); DeleteFile (PathToDLL2);

Cela devrait fonctionner. Alternativement, vous pouvez vous débarrasser de OpenSSL et utiliser SSL components à partir de notre SecureBlackbox.

+0

Merci beaucoup, votre suggestion a fonctionné (et maintenant je maintenant comment désinscrire des DLLs). – LaBracca

+1

Ceci est un mauvais conseil. Indy a beaucoup de références aux fonctions DLL, aux objets alloués (callbacks, etc.) passés dans/hors des DLL, etc. Décharger les DLL directement en utilisant FreeLibrary() seul ne permet pas à Indy de nettoyer tout ce qu'il utilise en interne. Indy a ses propres fonctions pour décharger les DLL en toute sécurité. Vous devriez utiliser ceux-ci à la place. Voir mon autre réponse. –

+0

@Remy en fait, le déchargement des DLL à l'arrêt ne devrait pas causer de problèmes à moins que vous gardiez des pointeurs vers les objets de la bibliothèque auxquels vous accédez à l'arrêt. Bien que, bien sûr, appeler votre méthode est une meilleure solution. Et se débarrasser d'OpenSSL est bien meilleur. –

5

Indy charge dynamiquement les DLL OpenSSL lors de l'exécution, puis, par défaut, ne les télécharge pas avant l'arrêt de l'application. Si vous souhaitez décharger les DLL plus tôt, vous devez appeler directement le IdSSLOpenSSL.UnLoadOpenSSLLibrary(). Cela déchargera les DLL et nettoiera toutes les références et les objets alloués qui leur sont liés.

1

Sinon, vous pouvez supprimer la DLL dans la section finalisation de l'unité de module de données ...

Questions connexes