Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Neustart der Applikation aus Stabilitätsgründen... (https://www.delphipraxis.net/211311-neustart-der-applikation-aus-stabilitaetsgruenden.html)

Maliko 29. Aug 2022 07:52

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von BigAl (Beitrag 1510919)
Es ist also ausgeschlossen, dass der Benutzer da Schindluder treibt mit dem Parameter (es gibt keine Tastatur)...

Ausgeschlossen ist das gar nicht mal. Wenn im Hintergrund ein Windows läuft und man die Anwendung schließen kann, bzw. die Startleiste von Windows zu sehen ist, dann aktiviert man einfach die Bildschirmtastatur und schon kann man "Schindluder" treiben.

BigAl 29. Aug 2022 08:19

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von Maliko (Beitrag 1510922)
Zitat:

Zitat von BigAl (Beitrag 1510919)
Es ist also ausgeschlossen, dass der Benutzer da Schindluder treibt mit dem Parameter (es gibt keine Tastatur)...

Ausgeschlossen ist das gar nicht mal. Wenn im Hintergrund ein Windows läuft und man die Anwendung schließen kann, bzw. die Startleiste von Windows zu sehen ist, dann aktiviert man einfach die Bildschirmtastatur und schon kann man "Schindluder" treiben.

Anwendung schließen geht nur mit Admin. Taskleiste ist nicht sichtbar:
Delphi-Quellcode:
    WindowState := TWindowState.wsMaximized;
    BorderStyle := bsNone;
    BoundsRect := Screen.MonitorFromWindow(Handle).BoundsRect;

venice2 29. Aug 2022 10:25

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von himitsu (Beitrag 1510916)
Delphi-Quellcode:
Self.RecreateWnd;


Zitat:

Zitat von venice2 (Beitrag 1510914)
Delphi-Quellcode:
if Restart then
  Result := ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)

Im ersten Post war es bereits richig (nur zusätzlich noch mit einem Parameter)
Bei dir nicht. Grund siehe https://www.delphipraxis.net/211304-...ml#post1510883

PS: Wenn man die Anwendung inkl. der ursprünglichen Parameter neu starten will, dann siehe MSDN-Library durchsuchenGetCommandLine. (einfacher als die vielen ParamStr's wieder neu zusammenzusetzen)

Es gibt viele Wege nach Köln.

Teste es doch einfach dann wirst du sehen das es das tut was es soll.
Ohne nennenswerte Problem im Bruchteil einer Millisekunde.
Es ist so schnell das es gar nicht ins Gewicht fällt oder man es merkt das die Anwendung neu gestartet wird.

Wichtig ist das Ergebnis nicht die art und weise wie dieses erreicht wird.

BigAl 29. Aug 2022 10:33

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von venice2 (Beitrag 1510928)
Es gibt viele Wege nach Köln.

Teste es doch einfach dann wirst du sehen das es das tut was es soll.
Ohne nennenswerte Problem im Bruchteil einer Millisekunde.
Es ist so schnell das es gar nicht ins Gewicht fällt oder man es merkt das die Anwendung neu gestartet wird.

Kommt natürlich darauf an wie viel Initialisierung stattfindet. Aber ja. Geht sehr schnell.

Ich hatte eigentlich eher bedenken wann ich den Neustart durchführe. In meinem ersten Post mache ich das ja im destructor der Main. Alternativ könnte ich das ja auch hinter das "Application.Run" setzen (was ich nun auch gemacht habe...). Das ist dann der letztmöglich Zeitpunkt.

venice2 29. Aug 2022 10:43

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von BigAl (Beitrag 1510929)
Zitat:

Zitat von venice2 (Beitrag 1510928)
Es gibt viele Wege nach Köln.

Teste es doch einfach dann wirst du sehen das es das tut was es soll.
Ohne nennenswerte Problem im Bruchteil einer Millisekunde.
Es ist so schnell das es gar nicht ins Gewicht fällt oder man es merkt das die Anwendung neu gestartet wird.

Kommt natürlich darauf an wie viel Initialisierung stattfindet. Aber ja. Geht sehr schnell.

Ich hatte eigentlich eher bedenken wann ich den Neustart durchführe. In meinem ersten Post mache ich das ja im destructor der Main. Alternativ könnte ich das ja auch hinter das "Application.Run" setzen. Das wäre dann der letztmöglich Zeitpunkt...

Jo!
Ich arbeite ja ohne die VCL mit eigener Skinengine von daher habe ich wohl nicht so immense Initialisierung wie du.
Ich schicke beim ändern des Skin aus meinen Menu
Delphi-Quellcode:
               
PostQuitMessage(0);              
Restart := TRUE;
und fertig.
Letztendlich zählt das Ergebnis.

BigAl 29. Aug 2022 10:49

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von venice2 (Beitrag 1510930)
Ich arbeite ja ohne die VCL mit eigener Skinengine von daher habe ich wohl nicht so immense Initialisierung wie du.
Ich schicke beim ändern des Skin aus meinen Menu
Delphi-Quellcode:
               
PostQuitMessage(0);              
Restart := TRUE;
und fertig.
Letztendlich zählt das Ergebnis.

Mit anderer Engine hatte ich überlegt. Habe hier eine ein lifetime "almdev" Lizenz. Aber ich denke das sicherste für die Zukunft sind immer noch die Bibliotheken von Emba. Zu viele Firmen haben sich über die Jahre vom Markt verabschiedet.

Und ja: Letztendlich zählt das Ergebnis. Das Forum hilft halt bei der Meinungsfindung :-).

Uwe Raabe 29. Aug 2022 13:08

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von BigAl (Beitrag 1510929)
Alternativ könnte ich das ja auch hinter das "Application.Run" setzen (was ich nun auch gemacht habe...). Das ist dann der letztmöglich Zeitpunkt.

Die finalization Abschnitte der Units werden noch später ausgeführt. Den spätesten Zeitpunkt den du damit noch erreichen könntest, wäre das finalization einer minimalen Unit, die im Projekt als erstes in der Uses-Anweisung steht.

Zu dem Zeitpunkt sind auch alle Forms und sonstige Komponenten der Anwendung freigegeben, was direkt nach dem Run in der Regel noch nicht der Fall ist.

So eine Unit könnte in etwa so aussehen:
Delphi-Quellcode:
unit AutoRestartUnit;

interface

var
  AutoRestart: Boolean = False;
  AutoRestartCmdLine: PChar;

implementation

uses
  Winapi.ShellAPI, Winapi.Windows;

initialization
  AutoRestartCmdLine := CmdLine;
finalization
  if AutoRestart then begin
    ShellExecute(0, 'open', PChar(ParamStr(0)), AutoRestartCmdLine, nil, SW_SHOW);
  end;
end.

himitsu 29. Aug 2022 13:25

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von venice2 (Beitrag 1510928)
Teste es doch einfach dann wirst du sehen das es das tut was es soll.

Wichtig ist das Ergebnis nicht die art und weise wie dieses erreicht wird.

Ja, es mag gehen, es ist denoch falsch.

Du kannst einen kleinen Nagel auch mit einer Zange ins Holz hauen, also geht es sozusagen, aber dennoch ist es nicht richtig.


Und genau weil zuviele so denken knallt es gern mal, sobald sich mal ein bissl was ändert.



Ja, PChar entspricht aktuell PWideChar und das wird sich so schnell nicht nochmal ändern,
aber da hört es nicht auf.
* Integer anstatt LPARAM/WPARAM/LRESULT als Typen SendMessage/PostMessage
* Interger als Cast für einen Pointer
* ...

BigAl 29. Aug 2022 13:50

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1510935)
Zitat:

Zitat von BigAl (Beitrag 1510929)
Alternativ könnte ich das ja auch hinter das "Application.Run" setzen (was ich nun auch gemacht habe...). Das ist dann der letztmöglich Zeitpunkt.

Die finalization Abschnitte der Units werden noch später ausgeführt. Den spätesten Zeitpunkt den du damit noch erreichen könntest, wäre das finalization einer minimalen Unit, die im Projekt als erstes in der Uses-Anweisung steht.

Zu dem Zeitpunkt sind auch alle Forms und sonstige Komponenten der Anwendung freigegeben, was direkt nach dem Run in der Regel noch nicht der Fall ist.

So eine Unit könnte in etwa so aussehen:
Delphi-Quellcode:
unit AutoRestartUnit;

interface

var
  AutoRestart: Boolean = False;
  AutoRestartCmdLine: PChar;

implementation

uses
  Winapi.ShellAPI, Winapi.Windows;

initialization
  AutoRestartCmdLine := CmdLine;
finalization
  if AutoRestart then begin
    ShellExecute(0, 'open', PChar(ParamStr(0)), AutoRestartCmdLine, nil, SW_SHOW);
  end;
end.

Da hast Du natürlich recht. Wobei ich mich schwer tue die "uses" des Projekts manuell zu bearbeiten. Bleibt meine Unit dann auch oben? Üblicherweise pflegt doch die IDE diese "uses"-Liste...

himitsu 29. Aug 2022 14:31

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Delphi hängt Units nur an, wenn es der Meinung ist, etwas würde fehlen.
Was drin war, bleibt erhalten.

Ausnahme: Das USES in der DPR, vor allem die Units mit IN, welches vom Projektmanager verwaltet wird.
Da hier das Uses dabei komplett neu geschrieben wird, kann/wird es passieren, dass z.B. Formatierungen, Kommentare und IFDEF verloren gehen.


Deine Unit muß hierbei bloß vor/über der "Forms"-Unit liegen, denn Application gibt dort im Finalization noch existierende Forms und DataModule frei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr.
Seite 2 von 3     12 3      

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