2010-12-02 11 views
2

J'ai écrit plusieurs services dans Delphi maintenant, mais je veux ajouter la facilité de mise à jour automatique du service soit à partir d'un chemin LAN unc ou d'un serveur http. J'ai réfléchi à cela et je suis intéressé à entendre les idées des gens. Je peux créer un thread qui vérifiera périodiquement la mise à jour, mais comment puis-je arrêter le service de désinstallation et d'installation automatique. Mes pensées initiales où écrire une application de console pour le faire et le démarrer en utilisant le processus de création, puis laissez le service s'arrêter et l'application de la console faire le travail, en démarrant la nouvelle version du service avant sa sortie. Est-ce une bonne stratergy ou shoul je considère quelque chose d'autre. Merci d'avanceMise à jour automatique d'un service

+0

Quelqu'un a déjà essayé d'utiliser les bits de Windows api? Ce sont les mises à jour des fenêtres de Mechanisiam. – MikeT

Répondre

1

Je fais ce que vous suggérez. Un thread vérifie occasionnellement une mise à jour. S'il est présent, il le télécharge et le place dans un endroit approprié. Il vérifie ensuite qu'il est sain (ne veut pas qu'il soit cassé!). Enfin, le thread lance ensuite une autre application avec des paramètres pour lui dire quoi faire, plus précisément, le nom du service, l'emplacement du fichier à remplacer, et le fichier pour le remplacer par. Alors le service attend juste. Lorsque l'application de mise à jour démarre, elle s'arrête momentanément pour s'assurer que le service est stable, puis utilise l'API de contrôle de service pour arrêter le service. Il surveille ensuite jusqu'à ce qu'il soit parti. Enfin, il s'arrête un peu pour s'assurer que Windows a vraiment terminé avec le fichier. Ensuite, il commence le processus de renommer l'ancien fichier pour le déplacer (s'il est toujours utilisé, il réessaye plusieurs fois), puis copie le nouveau fichier en place. Et enfin, il redémarre le service. Ensuite, le programme de mise à jour se ferme.

Cela a fonctionné de manière assez fiable pour mes services, ainsi que pour les applications autonomes (avec des paramètres différents pour que l'application de mise à jour sache quel mode). Et si vous faites attention, vous pouvez mettre à jour le programme de mise à jour en utilisant exactement le même système, ce qui est agréable à regarder.

+0

juste pour vous le faire savoir comme suggéré, en utilisant un serveur http et MS BITS pour faire le transfert, le serveur http a également servi un fichier XML détaillant les mises à jour disponibles, leur version, MD5 Hash et l'horodatage. Si vous voulez écrire votre propre serveur http pour les mises à jour en utilisant Delphi, assurez-vous d'utiliser la dernière version d'Indy. La prise en charge des transferts en morceaux était seulement implémentée et leur bug était de taille de fichier de plus de 2,1 Go jusqu'à ce que je signale le bug et qu'il soit corrigé. – MikeT

0

votre idée me semble très bonne, cependant en tenir compte: - ajouter le module (le noyau principal) au service qui sera déchargé et chargera le module mis à jour (fichier * .dll) lorsqu'une mise à jour est disponible - dans ce moment où le service doit mettre les « tâches » dans une file d'attente ou quelque chose ... vous pouvez en outre utiliser des plugins et/ou des scripts comme Pascal script ou DWScript

1

Je dois être le service un shell qui ne met à jour qu'un autre fichier exécutable ou DLL où se trouve le code réel. Avoir une certaine méthode de communication entre le shell et le processus enfant pour forcer un arrêt, puis demander à l'interpréteur de mettre à niveau et de relancer l'enfant. En outre, cela facilite considérablement le débogage du service et vous permet d'exécuter le processus enfant directement sans avoir à vous soucier des efforts supplémentaires requis pour déboguer les services Windows.

Questions connexes