RenameFile der laufenden Anwendung
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
RenameFile der laufenden Anwendung
Ich habe einen Auto-Updater in mein Programm eingebaut, der die laufende Anwendung per RenameFile() umbenennt. Das hatte auch funktioniert und geht auch bei einem Testprogramm, aber meine Anwendung mag sich jetzt nicht mehr umbenennen. LastError ist 32, eine sharing violation. Hat jemand eine Idee, wo ich nach dem Fehler suchen könnte?
-
- Beiträge: 475
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: RenameFile der laufenden Anwendung
Ich denke es wäre einfacher/eleganter die Updateroutine in ein externes Programm auszulagern und bei Programmstart prüfen ob Updates vorliegen.
-Hauptprogrammstart
-Update vorhanden?
-nein - Hauptprogramm laufen lassen
-ja - Updateprogramm starten - Hauptprogramm beenden
oder einfach nach dem herunterladen das Updateprogramm starten und Hauptprogramm schließen
-Hauptprogrammstart
-Update vorhanden?
-nein - Hauptprogramm laufen lassen
-ja - Updateprogramm starten - Hauptprogramm beenden
oder einfach nach dem herunterladen das Updateprogramm starten und Hauptprogramm schließen
mfg Ingo
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
Der Benutzer wird es mir danken, kein zweites Programm irgendwo rumliegen zu haben. Wie dem auch sei: Es hat schon funktioniert und geht jetzt nicht mehr. Ich habe an allen denkbaren Compilereinstellungen gedreht, alle Threads deaktiviert und die Umbenennung gleich zu Beginn gemacht - kein Erfolg. Diese Kleinigkeiten machen letzten Endes 90% des Programmieraufwands aus. Was ich alles sinnvolleres hätte programmieren können...
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
Die Idee sich selbst zu ersetzen wird kaum verwendet, vielleicht auch wegen einiger Probleme. In der Regel ist es einfacher, das wie von shockwave vorgeschlagen ein zweites Programm zu starten.
Was den Benutzer angeht: der wird sich eher weniger darum sorgen, dass ein anderes Programm ein Fenster aufmacht und nur Update hinaus schreibt. Beispiele gibts wie Sand am Meer: Lazarus, Mozilla Firefox/Thunderbird/etc. Deine Lösung dürfte im Übrigen auch nur unter Linux funktionieren, da zumindest Windows das bearbeiten von Exe-Dateien, die gerade ausgeführt werden, verbietet.
Was den Benutzer angeht: der wird sich eher weniger darum sorgen, dass ein anderes Programm ein Fenster aufmacht und nur Update hinaus schreibt. Beispiele gibts wie Sand am Meer: Lazarus, Mozilla Firefox/Thunderbird/etc. Deine Lösung dürfte im Übrigen auch nur unter Linux funktionieren, da zumindest Windows das bearbeiten von Exe-Dateien, die gerade ausgeführt werden, verbietet.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
Dem ist nicht so.da zumindest Windows das bearbeiten von Exe-Dateien, die gerade ausgeführt werden, verbietet
Code: Alles auswählen
procedure TForm1.ButtonOnClick(..);
RenameFile(Application.ExeName,ChangeFileExt(Application.ExeName,'.bak'));
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
Wenn ich ein Programm starte und versuche die Exe umzubennen, erhalte ich die Fehlermeldung: "<Programmname> kann nicht umbenannt werden: Die Datei wird von einer anderen Person bzw. einem anderen Programm verwendet. [...]"Scotty hat geschrieben:Dem ist nicht so.da zumindest Windows das bearbeiten von Exe-Dateien, die gerade ausgeführt werden, verbietet
Ich habe dazu extra mein Win XP SP2-Rechner eingeschaltet

MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
Ich würde auch sagen, was für Virenschutz verwendet ihrSocke hat geschrieben:Ich habe dazu extra mein Win XP SP2-Rechner eingeschaltetWelches Windows benutzt du denn?

Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: RenameFile der laufenden Anwendung
Die Exe kann sich nicht selbst verändern (umbenennen eingeschlossen), aber sich selbst lesen. Meine Lösung für Selbst-Updates läuft daher darauf hinaus, dass die Exe sich selbst kopiert (MeineAnwendung.exe --> MeineAnwendung.new) und dann per CreateProcess/TProcess diese "MeineAnwendung.new" mit dem Parameter "-selfupdate" aufruft. In meiner Anwendung prüf ich am Anfang einfach, ob ParamStr(1) = '-selfupdate' ist, und lasse die Anwendung sich dann wieder über ihren normalen Dateinamen drüber kopieren (MeineAnwendung.new --> MeineAnwendung.exe). Ist der erste Parameter anders/nicht vorhanden, prüfe ich, ob eine MeineAnwendung.new existiert, und lösche sie dann.
Der gesamte Update Prozess läuft dann z.B. so:
Viele Wege führen nach Rom
Der gesamte Update Prozess läuft dann z.B. so:
- Anwendung startet, ohne Parameter, auch keine .new Datei vorhanden
- Sie findet eine neue Version (z.B. per Checksum) und lädt diese als "MeineAnwendung.new" herunter
- Dann startet sie "MeineAnwendung.new -selfupdate" und beendet sich selbst
- MeineAnwendung.new stellt den Parameter -selfupdate fest, und kopiert sich selbst über "MeineAnwendung.exe"
- ... diese wird dann aufgerufen und MeineAnwendung.new beendet sich wieder (anstatt Hauptformular etc. anzuzeigen)
- MeineAnwendung.exe merkt nun, sie wurde ohne Parameter gestartet aber sie findet eine MeineAnwendung.new, welche sie nun löscht
- Danach geht der Start wie gewohnt weiter.
Viele Wege führen nach Rom

-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
@Hitman: für das Betriebssystem sind das dann zwei verschiedene Programme, die sich gegenseitig erstellen/ersetzen. Aber es sollte funktionieren.
Ich verwende mit Windows XP SP2 nur ein Anti-Sicherheitsprogramm, da ich für alles andere außer Spielen ausschließlich Linux verwende.af0815 hat geschrieben:Ich würde auch sagen, was für Virenschutz verwendet ihrAustausch/Umbennung wird von Schutzprogrammen zum Härten des Systems gerne verhindert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: RenameFile der laufenden Anwendung
+1. Windows hält immer Filelocks ein bisschen zu lange, aber Virenschutz usw macht das schlimmer.af0815 hat geschrieben:Ich würde auch sagen, was für Virenschutz verwendet ihrSocke hat geschrieben:Ich habe dazu extra mein Win XP SP2-Rechner eingeschaltetWelches Windows benutzt du denn?
Austausch/Umbennung wird von Schutzprogrammen zum Härten des Systems gerne verhindert.
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: RenameFile der laufenden Anwendung
XP in einer VirtualBox ohne Virenschutz.Socke hat geschrieben:Welches Windows benutzt du denn?
Nur der Explorer hält die Hand auf laufende Anwendungen. Ich glaube, dass schon ein Batch Script ausreicht, aber das Testprogramm funktioniert definitiv wie beschrieben. Allerdings ist, abgesehen vom Thread-Thema, der Virenschutz sicher ein gutes Argument für ein alternatives Vorgehen.
So ähnlich werde ich das wohl auch machen. Mir gefällt aber das *.new nicht. Wenn ein Anwender das Zip manuell herunter lädt, soll er/sie genauso damit umgehen können, wie ich aus dem laufenden Programm. Also werde ich entweder das Zip in ein spezielles Verzeichnis entpacken oder beim Auspacken umbenennen.Hitman hat geschrieben:CreateProcess/TProcess diese "MeineAnwendung.new" mit dem Parameter "-selfupdate"
Interessanter Weise hatte ich eine Version mit meiner Prozedur schon online gestellt, und Leute mit XP, Vista und Seven waren zufrieden mit dem Updateprozess. Da sind sicher viele mit Virenscannern, Firewalls und "was weiß ich nicht alles" dabei. Mich wundert es deswegen, dass Änderungen an einer anderen Stelle (Einbau von Sounds, Überarbeitung eines Threads) Probleme bereiten sollen. Ich werde noch ein, zwei Ideen prüfen.
PS: Der Debugger muss deaktiviert werden: Compilereinstellungen > Linken > -g, -gl