AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi [Unit für Delphi >= 2010] Eigene Anwendung neu starten
Thema durchsuchen
Ansicht
Themen-Optionen

[Unit für Delphi >= 2010] Eigene Anwendung neu starten

Ein Thema von Björn Ole · begonnen am 4. Aug 2011 · letzter Beitrag vom 8. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#1

[Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 4. Aug 2011, 13:24
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:
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.
Will man neu starten, dann einfach so:
Delphi-Quellcode:
uses uApplicationRestarter;

{...}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TApplicationRestarter.Restart;
end;
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.

Für Verbesserungsvorschläge wär ich sehr dankbar.
Angehängte Dateien
Dateityp: pas uApplicationRestarter.pas (4,1 KB, 28x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 4. Aug 2011, 14:09
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 Application.Restart nutzbar wäre.
Außerdem könnten dann auch User mit Delphis unter 2010 darüber freuen.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Geändert von chaosben ( 4. Aug 2011 um 14:57 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#3

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 4. Aug 2011, 14:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#4

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 6. Aug 2011, 18:28
Danke für die Vorschläge, ich arbeite mich mal durch:

Der Restarter ist ein class helper für TApplication und initialisiert sich selbst über die init-Routine der Unit.
Vom Programmcode her schöner find ich das nicht, allerdings hast du Recht, ist besser wenn man die Unit auch mit älteren Delphi Versionen benutzen kann. Ich hab es mal geändert.

Das hätte den Vorteil, das sich der "Aufwand" auf das Einbinden der Unit beschränkt
Die GUID muss allerdings immer noch irgendwo gesetzt werden, das wär ja unschön wenn man dafür in die Unit rein muss. Daher wird das Initialize wohl bleiben müssen.

1. Warum "if ParamStr(1)=" und nicht "FindCmdLineSwitch()"?
Die Funktion kannte ich noch gar nicht, danke, hab sie eingebaut.

2. Wenn bereits eine Instanz läuft, solltest Du die Parameter an diese weitergeben. Z.B. per Named Pipe.
Gute Idee, allerdings kommen mir Named Pipes dafür etwas zu umfangreich vor. Ich hab sie noch nie benutzt, von dem was ich lese scheint es mir aber etwas Overkill zu sein. Warum übergebe ich an ShellExecute nicht einfach CmdLine + ' restart' . Einwände?

3. Für Vista und später solltest Du eine Elevate-Möglichkeit einbauen (verb "runas" statt "open").
Verstehe nicht genau, was du meinst. open reicht doch alle Rechte weiter. Mit runas springt bei mir z.B. beim Neustart die UAC an, was ja nicht immer von Nöten ist.

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.
Ist erledigt.

Für weitere Ideen bin ich immer dankbar. Werde noch etwas testen und dann bald die aktualisierte Unit posten.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 6. Aug 2011, 22:30
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#6

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 7. Aug 2011, 10:52
Verzeiht mir meine Unwissenheit, aber wann ist es eigentlich notwendig, dass sich eine Anwendung selbst neu starten muss?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 7. Aug 2011, 11:09
KA was du da machst aber das geht mit 1 Zeile.
ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)

Noch einfacher geht es eigentlich nicht.
Und das sollte ab D1 funktionieren

Zitat:
aber wann ist es eigentlich notwendig, dass sich eine Anwendung selbst neu starten muss
Zum Beispiel bei mir wenn man seiner Anwendung Skins verpaßt hat.

gruss

Geändert von EWeiss ( 7. Aug 2011 um 11:13 Uhr)
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 7. Aug 2011, 11:18
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.
Delphi programming
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#9

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 7. Aug 2011, 17:59
Warum muss es zwingend eine GUID sein? Per default würde es imho auch der Pfad zu Programm tun.
Hmpf, hast Recht. Hab den GUID Parameter entfernt und folgenden Namen gegeben:semaphoreName := 'Local\' + StringReplace(ParamStr(0), '\', '/', [rfReplaceAll]); 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?

KA was du da machst aber das geht mit 1 Zeile.
ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)
Ja, so funktioniert es auch, allerdings kannst du so nicht garantieren, dass nur höchstens eine Instanz deiner Anwendung läuft. Das ist bei mir leider notwendig.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: [Unit für Delphi >= 2010] Eigene Anwendung neu starten

  Alt 7. Aug 2011, 18:46
Dann noch 3 zeilen dazu

Delphi-Quellcode:
initialization
  hMutex := CreateMutex(nil, True, 'Meine Anwendung);
if GetLastError = ERROR_ALREADY_EXISTS then
Halt;

finalization
if hMutex <> 0 then
CloseHandle(hMutex)
Soll aber nicht heißen das deine Unit nicht das selbe macht.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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