J'ai une question rapide à espérer: Est-il possible de retarder un peu l'exécution de ShellExecute?Attendre que ShellExecute soit exécuté?
J'ai une application avec autoupdater. Après avoir téléchargé tous les fichiers nécessaires, etc, il renomme les fichiers actuels à * .OLD et le nouveau comme le précédent. Assez simple. Mais alors j'ai besoin de supprimer ces fichiers .OLD. Cette procédure de 'nettoyage' est exécutée sur MainForm.OnActivate (avec une vérification s'il s'agit du premier proc activé). Mais cela arrive apparemment trop vite (je reçois False de DeleteFile). Voici la procédure:
procedure TUpdateForm.OKBtnClick(Sender: TObject);
const SHELL = 'ping 127.0.0.1 -n 2';
begin
ShellExecute(0,'open',pchar(SHELL+#13+Application.ExeName),nil,nil,SW_SHOWNORMAL);
Application.Terminate;
end;
Cette procédure est supposée redémarrer l'application. Je suis certain que le problème de suppression est causé par le démarrage rapide de la deuxième application, parce que si je le redémarre moi-même, en lui donnant un peu de temps, les fichiers sont supprimés normalement. Version: tl; dr version: J'ai besoin d'appeler ShellExecute() qui attend un bit (0,1 seconde environ) et THEN exécute la commande.
Remarque
J'ai essayé d'utiliser la commande -ping pour tenter de le retarder, mais cela n'a pas fonctionné.
Merci beaucoup à l'avance
Edit: reformulée
J'ai besoin que cela se produise || La première application se ferme; Attendez 100 ms; la deuxième application s'ouvre ||. Je dois d'abord appeler ShellExecute, puis attendre que l'application appelante se ferme complètement, puis exécuter le shell (c'est-à-dire ouvrir la deuxième application)
Je ne comprends pas.Vous voulez attendre 100 ms, puis faire 'ShellExecute'? Eh bien, faites-le! 'Sommeil (100); ShellExecute (...) '. Ou voulez-vous que ShellExecute ne revienne pas tant que le processus nouvellement créé n'est pas sorti? Si oui, en théorie, vous voulez le 'Sleep' *** après ***' ShellExecute', pas * avant * il. Mais c'est une solution laide. Au lieu de cela, vous devriez 'WaitForSingleObject' ou quelque chose comme ça. –
Je vais essayer de le reformuler: j'ai besoin que cela arrive || La première application se ferme; Attendez 100 ms; la deuxième application s'ouvre ||. Je dois d'abord appeler ShellExecute, puis attendre que l'application appelante se ferme complètement, puis exécuter le shell (c'est-à-dire ouvrir la seconde application) -> Aucune de vos suggestions. J'ai besoin de ShellExecute _not pour exécuter_ jusqu'à ce que l'application en cours soit complètement fermée (afin que je puisse supprimer ses fichiers) –
Vous ne pouvez pas faire cela. Après la fermeture de l'application 1, mais avant l'ouverture de l'application 2, vous ne pouvez rien faire car vous n'avez aucun programme en cours d'exécution. Ce que vous pouvez faire est d'appeler une application, de dormir, puis d'appeler une autre application, puis de terminer. Mais au lieu d'un 'sommeil 'fixe, vous devriez' WaitForSingleObject' ou quelque chose d'autre plus robuste. –