Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Buttonklick und Programm neustarten [Hilfe] (https://www.delphipraxis.net/10249-buttonklick-und-programm-neustarten-%5Bhilfe%5D.html)

StoRmtec 14. Okt 2003 18:22


Buttonklick und Programm neustarten [Hilfe]
 
Hy @all

Habe ein Problem.
Habe meinem Programm eine Update funktion eingebaut und jetzt möchte ich wenn das Programm fertig herunten ist und ich auf den Button klicke das das Programm automatisch geschlossen und dann gleich wieder neu gestartet wird.

Beenden und umschreiben das funktioniert alles nur der neustart.

Kann man das machen.

Mfg
StoRmtec

CalganX 14. Okt 2003 18:24

Re: Buttonklick und Programm neustarten [Hilfe]
 
Hi,
am Besten einfach mit Hier im Forum suchenShellExecute starten.

Chris

StoRmtec 14. Okt 2003 19:55

Re: Buttonklick und Programm neustarten [Hilfe]
 
Danke für den Tip und wie soll das dann funktionieren.

Mfg
StoRmtec

H4ndy 14. Okt 2003 21:00

Re: Buttonklick und Programm neustarten [Hilfe]
 
Das Frag ich mich auch.

Höhstens eine zweite Instanz dadurch starten
die eigentlich schon geupdatet sein müsste und danach
das alte Programm beenden.

Tom 14. Okt 2003 21:11

Re: Buttonklick und Programm neustarten [Hilfe]
 
- Download der Datei unter anderen Namen
- Original-EXE umbenennen
- Downloadfile passend umbenennen
- Programm verstecken (Form1.Hide)
- Programm starten (2. Instanz)
- 1. Instanz beenden
- umbenannte Original-EXE löschen

StoRmtec 15. Okt 2003 08:08

Re: Buttonklick und Programm neustarten [Hilfe]
 
Hy

Aber bevor das Programm nicht beendet ist kann er mir das nicht updateen oder?

mfg
StoRmtec

Tom 15. Okt 2003 08:18

Re: Buttonklick und Programm neustarten [Hilfe]
 
Gut erkannt. Die von mir angeführte Reihenfolge dürfte das Problem allerdings umgehen.

CenBells 15. Okt 2003 09:33

Re: Buttonklick und Programm neustarten [Hilfe]
 
Hallo,

du wirst die original exe aber nicht umbenennen können wenn das original programm noch läuft.

Gruß
Ken

Tom 15. Okt 2003 09:37

Re: Buttonklick und Programm neustarten [Hilfe]
 
Und warum nicht? Ich zumindest mache es immer so, wenn ich beruflich Updates einspiele. Kann ja nicht zig-Menschen bei der Arbeit stören ...

CenBells 15. Okt 2003 16:13

Re: Buttonklick und Programm neustarten [Hilfe]
 
hallo,

ich habe den Thread entweder nicht richtig gelesen oder nicht richtig verstanden.

Er will doch das update runterladen, die exe des laufenden programms umbenennen, das laufende programm beenden und nach dem umbenennen der runtergeladenen exe diese dann starten, oder? :gruebel:

Also, wenn ich im explorer eine laufende exe umbenenne, bekomme ich immer fehlermeldungen, weil diese von einem anderen prozess verwendet wird.

Ich lasse mich da aber echt gerne eines funktionierenden weges belehren, da ich daß auch schon seit einiger zeit versuche. :-D

Gruß
KEn

Christian Seehase 15. Okt 2003 16:35

Re: Buttonklick und Programm neustarten [Hilfe]
 
Moin Ken,

Zitat:

Zitat von CenBells
Also, wenn ich im explorer eine laufende exe umbenenne, bekomme ich immer fehlermeldungen,

Ich nicht.
Welches Betriebssystem verwendest Du?

Du kannst die Datei eines laufenden Programmes nicht löschen bzw. überschreiben.
Da aber der Dateiname nichts mit dem Dateiinhalt zu tun hat, und eben hier der schreibende Zugriff gesperrt kann er bei laufendem Programm geändert werden.

CenBells 15. Okt 2003 16:51

Re: Buttonklick und Programm neustarten [Hilfe]
 
Danke,

ich habe das seit Win95 zeiten nicht mehr probiert und damals habe ich mal fehlermeldungen bekommen. JEtzt geht es.
Danke

Gruß
Ken

NicoDE 15. Okt 2003 17:57

Re: Buttonklick und Programm neustarten [Hilfe]
 
Zitat:

Zitat von CenBells
ich habe das seit Win95 zeiten nicht mehr probiert und damals habe ich mal fehlermeldungen bekommen. JEtzt geht es.

So ist es, das Umbenennen ist unter Win9x nicht möglich.


Gruß Nico

blabla: Die 'sauberste Lösung' für Win32 auf x86 ohne Restdateien, die auch unter Windows XP/2003 funktioniert (dort kann die Datei, die zum Erzeugen eines Prozesses verwendet wurde, nicht gelöscht werden) besteht darin, einen 'Updater' in Form einer RunDll32-kompatiblen DLL zu erstellen (diese kann sich selbst löschen, da der Prozeß ja mit der, von Windows gelieferten, RunDll32-Tool erzeugt wurde). Diese Lösung erfordert aber einen nicht zu unterschätzenden Aufwand (Interface, Parser, Fehlerbehandlung, TS-aware, ...) - allerdings kenne ich keine allgemeine Beispiel-Implementation, sodaß bisher jeder bei nil anfangen darf...
(jemand Interesse und zuviel Zeit? :duck:)

SleepyMaster 16. Okt 2003 05:27

Re: Buttonklick und Programm neustarten [Hilfe]
 
Es würde doch auch mit einer Batchdatei gehen, die von deinem Programm zur Laufzeit erstellt wird.

Delphi-Quellcode:
var f: Textfile;
begin
    AssignFile(f, ChangeFileExt(ParamStr(0), '.bat'));
    ReWrite(f);
    WriteLn(f, ':1');
    WriteLn(f, Format('sleep 1000', [ParamStr(0)]));
    WriteLn(f, Format('Erase '+extractFilename(paramstr(0)), [ParamStr(0)]));
    WriteLn(f, Format('If exist '+extractFilename(paramstr(0))+' Goto 1', [ParamStr(0)]));
    WriteLn(f, Format('copy x '+extractFilename(paramstr(0)), [ParamStr(0)]));
    WriteLn(f, Format('Erase x', [ParamStr(0)]));
    WriteLn(f, Format(extractFilename(paramstr(0)), [ParamStr(0)]));
    WriteLn(f, 'Erase '+ExtractFileName(ChangeFileExt(ParamStr(0),'.bat')));
    CloseFile(f);
    ShellExecute(handle,'open',PChar(ExtractFileName(ChangeFileExt(ParamStr(0),'.bat'))),nil,PChar(ExtractFileDir(ChangeFileExt(ParamStr(0),'.bat'))),SW_HIDE);
So mach ich das zumindestens bei meinem Programm nach dem ich das Update herruntergeladen hab.
Musste den Code nur halt noch en bissel für dein Programm anpassen

himitsu 17. Okt 2003 01:12

Re: Buttonklick und Programm neustarten [Hilfe]
 
Hi SleepyMaster,
wo hast'n das mit dem "Sleep" her?

Für deinen Code bietet sich noch 'ne kleine Optimierung an:
Delphi-Quellcode:
var f: Textfile;
s1, s2, s3: Sting;
begin
    s1 := extractFilename(paramstr(0));
    s2 := ChangeFileExt(s1,'.ex_')
    s3 := ChangeFileExt(s1,'.bat')
    AssignFile(f, s3);
    ReWrite(f);
    WriteLn(f, '@echo off');
    WriteLn(f, ':1');
    WriteLn(f, 'Erase '+s1);
    WriteLn(f, 'If exist '+s1+' Goto 1');
    WriteLn(f, 'ren '+s2+' '+s1);
    WriteLn(f, s1);
    WriteLn(f, 'Erase '+s3);
    CloseFile(f);
    ShellExecute(handle,'open',PChar(s3),nil,PChar(ExtractFileDir(ParamStr(0))),SW_HIDE);
:arrow: Format( ... , [ParamStr(0)]) nicht nötig
:arrow: "copy x y" & "erase x" = "ren x y"
:arrow: es reicht, wenn die Dateinamen 1-mal berechnet werden
:?: "sleep x"?
:arrow: "echo off" spart Rechenleistung, da nicht "tausende" Zeilen angezeigt werden



So in etwas wollte ich das schreiben, war aber nicht mehr nötig:
...
neue Datei z.B. mit name.ex_ erstellen

Batchdatei schreiben:
z.B. update.bat (unter Win 2000 und XP geht auch update.cmd)
(notfalls die Dateinamen in " setzen)
Delphi-Quellcode:
@echo off
:s
del name.exe
if exist name.exe goto s
ren name.ex_ name.exe
name.exe
del update.bat
Batchdatei mit SHELLEXECUTE starten

aktuelle Instanz beenden

:arrow: nachdem beenden wird diese Datei gelöscht, die neue umbenannt und gestartet

NicoDE 17. Okt 2003 01:25

Re: Buttonklick und Programm neustarten [Hilfe]
 
Zitat:

Zitat von SleepyMaster
Es würde doch auch mit einer Batchdatei gehen, die von deinem Programm zur Laufzeit erstellt wird.

Grundsätzlich ja. An der Sache stört mich nur die mangelnde Möglichkeit der Fehlerbehandlung und Kommunikation mit dem Programm. Und es ist gar nicht so einfach eine Batch für alle Win32-Systeme zu schreiben (Tip: nimm absolute Pfade und vergiß nicht, daß es Dateinamen mit Leerzeichen gibt).


Gruß Nico

ps: und wo wir gerade dabei sind, statt ShellExecute('xxx.bat') empfiehlt sich '%ComSpec% /C "xxx.bat"' (da sonst unter Win9x in der Standardeinstellung die Konsole offen bleiben kann/wird...)

himitsu 17. Okt 2003 02:07

Re: Buttonklick und Programm neustarten [Hilfe]
 
@NicoDE

Ralative Pfadangaben sind möglich.
Und Dateinamen kann man doch in " setzen, dann ist das mit den Leerzeichen kein Porblem mehr.
Die Batch-Datei von mir läuft unter allen Windows-Versionen. Bei dem "Erase" bin ich mir allerdings nicht so sicher.

Mangelnde Möglichkeit der Fehlerbehandlung? Kenn' noch keine Vorfälle, wo bei diesem Schritt Fehler aufgetreten sind.
Wozu brauchst du denn eine Kommunikation mit dem Programm?

Has du noch ein paar Tipps zu Batch-Dateien unter Linux, bin da erst seit kurzem aktiv.

NicoDE 17. Okt 2003 02:31

Re: Buttonklick und Programm neustarten [Hilfe]
 
Zitat:

Zitat von himitsu
Ralative Pfadangaben sind möglich.

Aber meiner Meinung nach nicht sicher, muß jeder selbst entscheiden.
Zitat:

Zitat von himitsu
Und Dateinamen kann man doch in " setzen, dann ist das mit den Leerzeichen kein Porblem mehr.

Eben das habe ich in dem Beispiel vermißt, deswegen mein Hinweis (Ich habe anno dazumal ca. zwei Tage nur mit dem Testen meiner Batch auf verschiedensten Systemen zugebracht - und Windows und ich sind auf die merkwürdigstens Ideen und Zeichen in Dateinamen gekommen :))
Zitat:

Zitat von himitsu
Bei dem "Erase" bin ich mir allerdings nicht so sicher.

Dann teste es ;) (erase wird immernoch unterstützt, sag ich jetzt einfach mal so)
Zitat:

Zitat von himitsu
Mangelnde Möglichkeit der Fehlerbehandlung? Kenn' noch keine Vorfälle, wo bei diesem Schritt Fehler aufgetreten sind.

Zum Beispiel Warteschleife, weil das Beenden der einen Instanz des Programms auf einem Terminal Server nicht ausreichte, da ein anderer Benutzer auch beschlossen hatte, eben dieses Programm starten zu müssen... (und der Admin gerade den Shutduwn einleitet u.s.w. - es passieren komische Dinge auf Kundensystemen, glaub mir :))
Zitat:

Zitat von himitsu
Wozu brauchst du denn eine Kommunikation mit dem Programm?

Und wenn es nur dazu da ist, dem Benutzer mitzuteilen, daß es eben nicht geklappt hat (warum ist völlig nebensächlich).
Zitat:

Zitat von himitsu
Has du noch ein paar Tipps zu Batch-Dateien unter Linux, bin da erst seit kurzem aktiv.

Leider nicht.

Ich schlage hiermit vor, (wie alle anderen) eine kleine Update.exe zu schreiben, die die Arbeit (Austausch) erledigt.


Gruß Nico


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.

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