Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Eigener Updater / Problem: Datei in Verwendung (https://www.delphipraxis.net/169559-eigener-updater-problem-datei-verwendung.html)

topsecret 28. Jul 2012 20:11

Eigener Updater / Problem: Datei in Verwendung
 
Hallo,

ich habe mir einen simplen Updater erstellt, der von meinem Hauptprogramm heruntergeladen wird, dann ausgeführt wird und anschließend erneut eine Datei herunterläd, welche dann das Hauptprogramm ersetzten soll.

Der Updater wird vom Hauptprogramm via winExec() gestartet. Anschließend wird ein Application.Terminate ausgeführt. (Dies kann leider nichtmehr geändert werden, da das Programm schon veröffentlicht wurde.)

Wenn nun versucht wird das Hauptprogramm zu ersetzten, kommt ein Zugriffsfehler, da das Programm im Hintergrund noch geöffnet ist. Sobald allerdings diese Messagebox erscheint, schließt sich dass Hauptprogramm im Hintergrund - aber eben zu spät.
Ebenso schließt es sich, wenn ich ein showMessage() ausführe.

Allerdings möchte ich keine Messagebox dazwischen haben, die den "Flow" behindert ;) Was machen also die Messageboxen, was ein einfaches Result nicht auch machen würden und warum wird das Hauptprogramm nicht sofort beendet?
Kennt jemand das Problem?

Ich hoffe auf baldige Hilfe :)

Bernhard Geyer 28. Jul 2012 20:15

AW: Eigener Updater / Problem: Datei in Verwendung
 
1, WinExec ist veraltet. Nimm ShellExecute.

2, AFAIK haben wir noch ein Halt eingebaut um wirklich die Anwendung zu beenden.
Ansonsten schau doch in der Prozessliste ob der Exe-Prozess noch läuft und warte dann ein paar ms oder Zeig wenns zu lange dauert noch ein "Hauptprogramm wird heruntergefahren" oder ähnliches an.

jaenicke 28. Jul 2012 20:18

AW: Eigener Updater / Problem: Datei in Verwendung
 
Benenne die alte exe einfach um. :wink:
Dann ist es egal, ob die noch läuft.

Und du kannst ja einerseits prüfen, ob das Programm noch läuft (EnumProcesses z.B.) und andererseits bekommst du ja als Rückgabewert, ob das Löschen bzw. umbenennen erfolgreich war.

Ich würde die aber sowieso umbenennen, damit man die, wenn beim Update etwas schief geht, notfalls wiederherstellen kann.

Bernhard Geyer 28. Jul 2012 20:21

AW: Eigener Updater / Problem: Datei in Verwendung
 
Zitat:

Zitat von jaenicke (Beitrag 1176170)
Benenne die alte exe einfach um. :wink:
Dann ist es egal, ob die noch läuft.

Ist kein 100% Lösung. Geht erst wieder seit einiger Zeit. Jahrelang war dieses Umbenennen nicht möglich und wer weiß ob es MS irgendwann durch ein Update wieder verbietet.

topsecret 28. Jul 2012 20:33

AW: Eigener Updater / Problem: Datei in Verwendung
 
Als Erstes vielen Dank für die schnellen Antworten :)

Zitat:

1, WinExec ist veraltet. Nimm ShellExecute.
Werde ich in Zukunft gerne machen, allerdings kann ich es, wie gesagt, momentan leider nicht anwenden ^^.

Nachzuschauen ob der Prozess beendet wurde, finde ich jedenfalls schonmal eine gute Idee!

Aber ich frage mich dennoch was durch das showMessage() ausgelöst wird.
Z.B. wenn ich ein sleep() in den Updater einbaue - egal wie lang - wird das Hauptprogramm nie beendet werden bis eine Exception kommt.

Bernhard Geyer 28. Jul 2012 21:54

AW: Eigener Updater / Problem: Datei in Verwendung
 
Zitat:

Zitat von topsecret (Beitrag 1176173)
Werde ich in Zukunft gerne machen, allerdings kann ich es, wie gesagt, momentan leider nicht anwenden ^^.

Wieso nicht? Was ist so schwer daran eine Zeile auszutauschen? Damit würde schon mal das zu aktualisierende programm angepasst.

Zitat:

Zitat von topsecret (Beitrag 1176173)
Z.B. wenn ich ein sleep() in den Updater einbaue - egal wie lang - wird das Hauptprogramm nie beendet werden bis eine Exception kommt.

Falls WinExec intern CreateProcess aufruft könnte ich mir schon sowas wie "race conditions" vorstellen. Keine Rückmeldung im aufgerufenen Programm - WinExec kehrt nicht zurück.
Probier mal was passiert wenn du eine weitere Exe startest welche das Update durchführt und die erste aufgerufene Exe beendest.

topsecret 28. Jul 2012 22:25

AW: Eigener Updater / Problem: Datei in Verwendung
 
Zitat:

Wieso nicht? Was ist so schwer daran eine Zeile auszutauschen? Damit würde schon mal das zu aktualisierende programm angepasst.
Klar, das mach ich auch ;) Ich meinte auch nur das bereits ausgeteilte Programm.

Zitat:

Probier mal was passiert wenn du eine weitere Exe startest welche das Update durchführt und die erste aufgerufene Exe beendest.
Japp, das funktioniert!
Gibt eine Möglichkeit "zwischenzeitlich" eine Rückmeldung zu machen?
Sonst werde ich evtl. einen Thread verwenden. Das müsste ja rein theoretisch dann auch funktionieren.

jaenicke 29. Jul 2012 01:58

AW: Eigener Updater / Problem: Datei in Verwendung
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1176172)
Zitat:

Zitat von jaenicke (Beitrag 1176170)
Benenne die alte exe einfach um. :wink:
Dann ist es egal, ob die noch läuft.

Ist kein 100% Lösung. Geht erst wieder seit einiger Zeit. Jahrelang war dieses Umbenennen nicht möglich und wer weiß ob es MS irgendwann durch ein Update wieder verbietet.

Naja, um genau zu sein geht es auf der NT-Schiene (zumindest ab 2000, ich glaube auch schon vorher) und ging nur unter Win9x usw. nicht. Dass Microsoft das wieder einführt, ist wohl nicht zu erwarten. :zwinker:

hathor 29. Jul 2012 06:02

AW: Eigener Updater / Problem: Datei in Verwendung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delete on reboot

Code:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Delete on reboot\command]
@="CMD /E:OFF /C REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\Currentversion\\RunOnce /v \"Del %1 OnNextReboot\" /d ^\"cmd.exe /c DEL /F /Q \\\"%1\\\"\" /f\""

[HKEY_CLASSES_ROOT\*\shell\Open]

[HKEY_CLASSES_ROOT\Folder\shell\Delete on reboot\command]
@="CMD /E:OFF /C REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\Currentversion\\RunOnce /v \"Del %1 OnNextReboot\" /d ^\"cmd.exe /c RD /S /Q \\\"%1\\\"\" /f\""
Oder:
Remove on Reboot (Shell Extension - Right click...)
im Anhang

Sim_Star 29. Jul 2012 09:38

AW: Eigener Updater / Problem: Datei in Verwendung
 
mach das Update, also den Austausch der Dateien doch per batch Datei. Total simpel und du bruachst weder nen restart noch was anderes...

lg marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz