Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 03:56 Uhr.
Seite 2 von 2     12   

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