Près d'exécuter la version de programme avant d'installer la mise à jour (Inno Setup)
Cela devrait être simple, j'ai besoin d'arrêter n'importe quelle version précédente de mon programme en cours d'exécution lorsque le programme d'installation démarre.
La plupart des gens ont suggéré de faire un exe
qui fait cela, et en l'appelant avant de Inno Setup démarre. J'ai créé un exe
à l'aide de AutoIt qui tue tous les processus de mon programme. Le problème est que je ne sais pas comment obtenir de l'Inno Setup pour appeler avant d'installer quoi que ce soit.
Comment dois-je appeler un exécutable avant d'installer les fichiers?
Sinon, si je peux détecter si un programme est en cours d'exécution et demander à l'utilisateur de le fermer, ce serait trop de travail.
Vous devez vous connecter pour publier un commentaire.
Si l'application dispose d'un Mutex, vous pouvez ajouter un
AppMutex
valeur dans votre Inno Setup installer et il affichera un message indiquant à l'utilisateur d'arrêter le programme. Vous pourriez être en mesure de trouver le Mutex (si il en a une) à l'aide de SysInternals Process Explorer et sélectionner le programme /processus et de la recherche au niveau des Poignées (CTRL-H) dans le Volet Inférieur.Voici un lien à un article de la base qui mentionne plusieurs méthodes:
http://www.vincenzo.net/isxkb/index.php?title=Detect_if_an_application_is_running
Sinon, vous pouvez essayer ce (non testé) du code de la
InitializeSetup
:PrepareToInstall
au lieu deInitializeSetup
pour arrêter l'application à mettre à jour.WM_CLOSE
n'a pas nécessairement besoin de l'application va se fermer. Que faire si il a le réglage "Près de systray"? Pourriez-vous suggérer une solution pour ce cas? Je pense qu'on pourrait envoyer personnaliséWM_USER+X
message, ou à exécuter destaskkill
/tskill
sur le pire des cas.CloseApplications=force
dans [Installation] section de votre InnoSetup projet.Dans la version 5.5.0 (Publié en Mai 2012) Inno Setup ajouté le support pour le Le Gestionnaire De Redémarrage API sur Windows Vista et versions ultérieures.
Citation de MSDN liés à la documentation (l'emphase est mienne):
La bonne chose est que vous n'avez pas besoin d'écrire du code personnalisé dans le programme d'installation ou de votre application, pour demander à l'utilisateur de le fermer ou de le fermer automatiquement.
Si vous voulez que votre demande de redémarrer après la mise à jour est terminée, vous devez appeler le
RegisterApplicationRestart
fonction de votre application.Les valeurs par défaut pour les nouvelles directives ferme tous les .exe, .dll et .chm fichiers contenus dans le
[Files]
section de l'installateur.Les changements liés à la il sont là (notes de version):
CloseApplicationsFilter
est la clé pour de nombreuses applications. Développez le filtre pour inclure les types de fichiers qui sont à l'origine des problèmes.RegisterApplicationRestart
? Mon application est déjà en cours, à commencer par lui-même après le redémarrage du système (par exemple, il s'agit d'une auto-démarrage du service) donc je suppose que je devrais utiliserRestartNoReboot = 8
? Également dans le contexte d'une Inno setup installation d'une nouvelle version (mise à jour), n'utilisantRestartNoPatch = 4
dire qu'il ne sera pas automatiquement redémarrer l'application si elle n'a pas de mise à jour?J'ai essayé à l'aide de la accepté de répondre (et le suivi par jachguate), mais elle ne les tue pas ma demande. Il ressemble à une partie de la raison en était que ma fenêtre de l'application n'avait pas de texte associé avec elle, mais quelle est la vraie raison, j'ai utilisé la commande shell pour le tuer et que travaillé. Dans le [code] section, vous voulez ajouter la fonction suivante. Elle est appelée juste avant l'installation des fichiers sont copiés.
Si vous êtes à l'aide de InnoSetup, vous pouvez regarder dans l'obtention de votre InnoSetup installer pour faire un Windows SendBroadcastMessage, et d'obtenir votre application pour écouter le message. Lorsque votre application reçoit le message, il doit s'arrêter lui-même.
Je l'ai fait moi-même avec un InnoSetup programme d'installation, et il fonctionne très bien.
Voici un lien vers une Inno script d'Installation qui invite à l'utilisateur de fermer le programme cible, si elle détecte que le programme est en cours d'exécution. Une fois que l'utilisateur ferme le programme, ils peuvent cliquer sur "Réessayer" pour procéder à l'installation:
http://www.domador.net/extras/code-samples/inno-setup-close-a-program-before-reinstalling-it/
Ce script est basé sur un simple script, trouvé dans l'Inno Setup Extensions de la Base de Connaissances:
http://www.vincenzo.net/isxkb/index.php?title=Call_psvince.dll_on_install_and_uninstall
Si vous êtes heureux d'écrire votre propre DLL, vous pouvez utiliser l'outil d'aide de l'API pour TlHelp32.pas de déterminer quelles applications sont en cours d'exécution, et ensuite obtenir un handle de fenêtre à l'aide de EnumWindows, puis envoyer un message WM_CLOSE à la poignée de la fenêtre.
C'est un peu de douleur, mais il devrait fonctionner:
J'ai une certaine utilité des classes wrapper que j'ai développé avec un ami d'un certain temps. Ne peut pas se souvenir si l'on se base sur quelqu'un d'autre code.
TWindows.ProcessISRunning et TWindows.StopProcess peut aider.
J'ai eu du succès en utilisant WMIC :
Vous pouvez également le faire dans le
InitializeSetup
mais si vous le faites, gardez à l'esprit que vous n'avez pas encore accès à la{app}
constante. Mon programme ne demande pas de chemin d'installation, mais les vôtres.InnoSetup vous permet de fixer Pascal scripts à divers endroits dans le processus de construction. Essayez de fixer un script qui appelle ShellExecute. (Que vous pouvez importer le moteur de script si elle ne l'est pas déjà.)
Bien, je pense que le moyen le plus facile pour effectuer ce peut être la création d'une DLL en Delphi, qui détecte si votre programme est en cours d'exécution et demander à l'utilisateur de le fermer, mettre le DLL dans votre configuration et de l'utilisation du drapeau "dontcopy" (à vérifier dans http://www.jrsoftware.org/ishelp/ en vertu de Pascal Scripts \ à l'Aide de Dll pour un exemple).
Btw, la prochaine fois, utiliser les mutex, Inno Setup également soutien et est beaucoup plus facile.
EDIT: et pour l'extraction d'un fichier (si vous voulez l'utiliser .exe que vous mentionnez), il suffit d'utiliser ExtractTemporaryFile().