Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: RunAs unter Win7 (ohne UAC)

  Alt 16. Mär 2012, 16:34
Das Programm benutzt ein Mutex, um mehrfache Instanzen zu verhindern. Ich muss also die laufende Instanz sofort nach (einem erfolgreichen) ShellExecuteEx schließen, damit die neue Instanz die Chance hat, zu starten.
Ich mache das in meiner Updaterunit ähnlich, aber die macht die Synchronisation der Starts per IPC.

Ich starte, wenn ich noch keine Adminrechte habe, eine Instanz mit Adminrechten. Diese Instanz benennt die aktuellen Dateien um und kopiert die neuen Dateien ins Verzeichnis. Dann startet sie die ggf. neue Exe, die dann auch Adminrechte hat, sagt der ersten Instanz Bescheid und beendet sich selbst.
Die erste Instanz startet die neue Exe im selben Kontext wie die ursprüngliche Exe (also z.B. ohne Adminrechte) und beendet sich. Die neu gestartete Exe sagt der neuen Admin-Instanz Bescheid und wartet.
Die neue Admin-Instanz löscht nun die zuvor gesicherten Dateien, wenn das Update bis hierhin gekommen ist, meldet den Erfolg des Aufräumens an die neue Instanz im Benutzerkontext und beendet sich.
Die neue Instanz im Benutzerkontext lädt den Zustand der ersten Instanz wieder und sagt dann dem Benutzer Bescheid, dass das Update fertig ist.
Dazu kommt noch die Kommunikation für die Fortschrittsanzeige.

Das funktioniert so sehr gut und ich denke, dass das bei dir auch gehen würde. Deine neue Instanz merkt am Parameter, dass da noch eine alte Instanz beendet werden muss. Dann meldet diese der ersten Instanz, dass sie erfolgreich gestartet ist und wartet bis sich die erste Instanz beendet hat (der Mutex also reserviert werden konnte).
Die erste Instanz wartet nach dem Start bis die Antwort der neuen Instanz kommt und beendet sich dann.

Das sollte doch funktionieren, oder?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat