Warte, bevor ShellExecute ausgeführt wird?

8

Ich habe eine hoffentlich schnelle Frage: Ist es möglich, die Ausführung von ShellExecute ein wenig zu verzögern?

Ich habe eine Anwendung mit Autoupdater. Nachdem es alle notwendigen Dateien usw. heruntergeladen hat, benennt es die aktuellen Dateien in * .OLD und das neue als das vorherige um. Einfach genug. Aber dann muss ich diese .OLD-Dateien löschen. Diese 'Aufräum'-Prozedur wird auf MainForm.OnActivate ausgeführt (mit einer Überprüfung, ob es der erste Aktivierungsprozess ist). Aber das passiert anscheinend zu schnell (ich bekomme False von DeleteFile). Dies ist die Vorgehensweise:

%Vor%

Diese Prozedur soll die Anwendung neu starten. Ich bin mir sicher, dass das Löschen Problem durch den schnellen Start der zweiten Anwendung verursacht wird, denn wenn ich es selbst neu starte und es ein wenig Zeit gebe, werden die Dateien normalerweise gelöscht.

tl; dr Version: Ich muss ShellExecute () aufrufen, das ein bisschen wartet (etwa 0,1 Sek.) und DANN den Befehl ausführt.

Hinweis

Ich habe versucht, mit dem Befehl -ping zu versuchen, es zu verzögern, aber es hat nicht funktioniert.

Vielen Dank im Voraus

Bearbeiten: Umformuliert

Ich muss das tun || Erste App schließt sich; Warte 100 ms; zweite App öffnet sich ||. Ich muss ShellExecute zuerst aufrufen, dann warten, bis die aufrufende Anwendung sich vollständig schließt, dann die Shell ausführen (d. H. Zweite Anwendung öffnen)

    
Martin Melka 15.05.2011, 16:20
quelle

3 Antworten

5

Sie machen einen Autopatcher richtig?

Ich hatte das gleiche Problem, und so habe ich es umgangen:

Sie starten eine zweite App mit dem Argument "--delay" oder so ähnlich. Die zweite Anwendung handhabt das Argument "--delay" und schläft für 100 ms und läuft dann normal weiter.

    
user703016 15.05.2011, 16:34
quelle
3

Diese Routine ist ein Util Code in unserer Game Engine. Es kann eine ausführbare Datei ausführen und optional darauf warten, dass es beendet wird. Es wird seinen Exit-Code zurückgeben:

%Vor%

Hier ist ein Code, der prüfen kann, ob ein Prozess existiert. Also ... aktuelle App ruft den Updater auf und beendet sich. Der Updater kann prüfen, ob die alte App beendet wurde und es tun (umbenennen, aktualisieren, löschen, usw.):

%Vor%     
Simvector Technologies 15.05.2011 17:01
quelle
2

Wenn Sie CreateProcess anstelle von ShellExecute verwenden können, können Sie auf die Prozesskennung warten. Der Prozess-Handle wird signalisiert, wenn die Anwendung beendet wird. Zum Beispiel:

%Vor%

Wenn ExecAndWait zurückkehrt, können Sie bei Bedarf 100 ms lang schlafen.

N @

    
Nat 24.05.2011 03:52
quelle

Tags und Links