[Unit für Delphi >= 2010] Eigene Anwendung neu starten
Liste der Anhänge anzeigen (Anzahl: 1)
Huhu,
ich möchte hier mal eine Unit zur Verfügung stellen, die das Neustarten der eigenen Anwendung sehr leicht gestaltet. Als Nebeneffekt kann es auch nur maximal eine laufende Instanz der Anwendung geben. Zuerst muss die Unit in die uses Liste der .dpr (Project -> View Source) am besten als erstes eingebunden werden. Danach sollte noch mittels Strg+Shift+G eine GUID erzeugt und mit der vorhandenen ersetzt werden. Anschließen muss die Unit zusätzlich noch dort eingebunden werden, wo die Restart Methode aufgerufen werden soll, also z.B. in der Unit1.pas. Kleines Beispiel: Die .dpr
Delphi-Quellcode:
Will man neu starten, dann einfach so:
program Project1;
uses // Unit einbinden \\ uApplicationRestarter in 'uApplicationRestarter.pas', // Alle weiteren Units ... \\ Forms, Unit1 in 'Unit1.pas' {Form1} , {$R *.res} begin // Diese zwei Zeilen einfügen und GUID abändern. \\ if not TApplicationRestarter.Initialize(Application.Handle, '{33EB3B5C-9A2C-4E85-805C-FFD49C1AD468A}') then Exit; // Ab hier gehts normal weiter \\ Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; end.
Delphi-Quellcode:
Restart() gibt einen Boolean zurück, bei False kann man mittels GetLastError mit dem genauen Fehlergrund weiterarbeiten. Das Ganze geht leider erst ab Delphi 2010. Die Unit hab ich unter XE geschrieben und getestet, sollte aber auch unter 2010 laufen. Werde ich in den kommenden Tagen testen.
uses uApplicationRestarter;
{...} procedure TForm1.Button1Click(Sender: TObject); begin TApplicationRestarter.Restart; end; Für Verbesserungsvorschläge wär ich sehr dankbar. :thumb: |
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Danke fürs Teilen. :)
Ich persönlich würde folgende Vorgehensweise für "schöner" befinden: Der Restarter ist ein class helper für TApplication und initialisiert sich selbst über die init-Routine der Unit. Das hätte den Vorteil, das sich der "Aufwand" auf das Einbinden der Unit beschränkt und es ganz easy per
Delphi-Quellcode:
nutzbar wäre.
Application.Restart
Außerdem könnten dann auch User mit Delphis unter 2010 darüber freuen. |
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Hmmm... ok, ein paar hoffentlich konstruktive Vorschläge:
1. Warum "if ParamStr(1)=" und nicht "FindCmdLineSwitch()"? 2. Wenn bereits eine Instanz läuft, solltest Du die Parameter an diese weitergeben. Z.B. per Named Pipe. 3. Für Vista und später solltest Du eine Elevate-Möglichkeit einbauen (verb "runas" statt "open"). 4. Auf Rechnern mit Terminal Services (also auch Fast User Switching) könntest Du Probleme haben. Gib dem Semaphor vllt. besser mal nen "Local\"-Prefix. |
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Danke für die Vorschläge, ich arbeite mich mal durch:
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
. Einwände?
CmdLine + ' restart'
Zitat:
Zitat:
Für weitere Ideen bin ich immer dankbar. Werde noch etwas testen und dann bald die aktualisierte Unit posten. |
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Warum muss es zwingend eine GUID sein? Per default würde es imho auch der Pfad zu Programm tun. Und für den Fall, das das nicht eindeutig genug ist, kann man ja noch eine GUID setzen. Denk ich. :-)
|
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Verzeiht mir meine Unwissenheit, aber wann ist es eigentlich notwendig, dass sich eine Anwendung selbst neu starten muss? :gruebel:
|
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
KA was du da machst aber das geht mit 1 Zeile.
Delphi-Quellcode:
ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)
Noch einfacher geht es eigentlich nicht. Und das sollte ab D1 funktionieren :) Zitat:
gruss |
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Zum Beispiel dann, wenn die Anwendung (aus welchem Grund auch immer) Admin-Rechte braucht.
Oder der Einfachheit halber, um die Initialisierung beim Programmstart nochmal zu durchlaufen, ohne große Änderungen am Code. Oder bei einer unerwarteten Exception, bei der man nicht genau weiß was gerade schiefgelaufen ist (z.B. DB-Verbindung kaputt). Oder wenn es ein Update der mitgelieferten DLLs gemacht hat und diese dann "sauber" neu laden soll. Die letzten 3 treten bei einem sauber programmierten Programm so gut wie gar nicht auf, bei bestehendem Code vielleicht schon. |
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Zitat:
Delphi-Quellcode:
Allerdings ist ein Editieren der .dpr immer noch notwendig, da ja der Programmstart u.U. abgebrochen werden muss. Oder kann ich das irgendwie sauber aus dem initialization Teil der Unit heraus machen?
semaphoreName := 'Local\' + StringReplace(ParamStr(0), '\', '/', [rfReplaceAll]);
Zitat:
|
AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Dann noch 3 zeilen dazu ;)
Delphi-Quellcode:
Soll aber nicht heißen das deine Unit nicht das selbe macht.
initialization
hMutex := CreateMutex(nil, True, 'Meine Anwendung); if GetLastError = ERROR_ALREADY_EXISTS then Halt; finalization if hMutex <> 0 then CloseHandle(hMutex) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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