Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   vor runterfahren ein programm starten (https://www.delphipraxis.net/6755-vor-runterfahren-ein-programm-starten.html)

heiopei 21. Jul 2003 12:12


vor runterfahren ein programm starten
 
Hallo,
kann man ein programm ausführen lassen, das ausgeführt wird, wenn windows herunter gefahren werden soll, wenn ja wie?(das es beim windowsstart sowas
gibt, weis ich)
danke,
heiopei

Gast 21. Jul 2003 12:17

Re: vor runterfahren ein programm starten
 
Hiho,

das kannst du in der Systempolicy einstellen (ab Windows 2000 aufwärts)!
Wenn du ein anderes System hast, gibt es da keine sichere Methode. Auf NT müßtest du eine eigene GINA schreiben ... auf 9x bliebe WM_QUERYENDSESSION und WM_ENDSESSION (die arbeiten auf NT meiner Erfahrung nach nicht sehr zuverlässig!)

heiopei 21. Jul 2003 12:29

Re: vor runterfahren ein programm starten
 
Hallo Assarbad,

Delphi-Quellcode:
Wenn du ein anderes System hast, gibt es da keine sichere Methode.
was soll das heißen? Ist das system dann absturzgefährdet, oder was?

Wie verwende ich die Funktionen dann?

Danke,
heiopei

sakura 21. Jul 2003 12:31

Re: vor runterfahren ein programm starten
 
Es gibt auch den "Quick-Shutdown", wenn ich auf den Schalter drücke und der Rechner innerhalb von 5 Sek. runterfährt. Wird ab Win98 oder so unterstützt. Da wird wohl kaum noch ein Programm gestartet.

...:cat:...

heiopei 21. Jul 2003 12:36

Re: vor runterfahren ein programm starten
 
Hallo sakura,
eigentlich meinte ich ja über start|beenden|herunterfahren :mrgreen:
aber wenn du meinst, dass heut zu tage jeder diese funktion benutzt
dann ist's natürlich witzlos son programm zu machen :wink:
tschüss,
heiopei

MPirious 21. Jul 2003 12:55

Re: vor runterfahren ein programm starten
 
Hi
hatte gerade das selbe Problem, wollte eine Art Backupprogramm schreiben.
Ich habe es so gelöst:
Im onCloseQuery Ereignis meines Hauptformulars CanClose auf false gesetzt und anschließend die Prozedur zur Bearbeitung aufgerufen.
Am Ende dieser Prozedur Windows runterfahren und direkt danach Application.Terminate

Funktioniert soweit

Luckie 21. Jul 2003 13:03

Re: vor runterfahren ein programm starten
 
Zitat:

Zitat von MPirious
Am Ende dieser Prozedur Windows runterfahren und direkt danach Application.Terminate

Was hast du für ein Windows, welches nach dem Runterfahren noch Programme ausführen kann? :roll:

Gast 21. Jul 2003 17:41

Re: vor runterfahren ein programm starten
 
@MPirious: Genau das ist Quark. Wenn du so arbeitest, funzt es auf MEINEM System garantiert nicht. Du solltest dir dazu mal einfach
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\WaitToKillServiceTimeout [default 5000]

und

HKEY_USERS\.DEFAULT\Control Panel\Desktop\WaitToKillAppTimeout [default 20000]

... anschauen.

Der rote Wert kann such ein Userprofil sein. Das war es, was ich mit unsicher meinte!!! Unter NT muss es die GINA handlen. Unter 9x gibt es keinen solchen, oder gar sicheren Mechanismus.

Das was du machst, ist einfach genauso clever wie RegisterServiceProcess() zu verwenden, oder zu sagen, mein Programm ist kompatibel zu NT, aber die Toolhelp API zu nutzen.

----
Und um die erste Rueckfrage zu beantworten: Es hatte nix mit der Sicherheit/Stabilitaet des Systems zu tun, sondern einzig damit, dass man sich nicht sicher sein kann, dass das System den Prozess nicht einfach killt, bevor der seinen Job machte.

MPirious 21. Jul 2003 20:23

Re: vor runterfahren ein programm starten
 
@Luckie: Mit Windows herunterfahren meine ich den Befehl geben, mein Windoof braucht ca. 5 Sekunden, bis es alle Prozesse beendet hat. Sind bei mir immer sehr viele. Deswegen fürt mein Windows auch Programme "nach" dem Herunterfahren aus.
Und falls ich euch doch falsch verstanden habe und ihr meint, dass mein Programm beim ersten Verusch Windows herunterzufahren beendet wird, muss ich erwiedern, dass es das überlebt. Ich war selbst überrascht, habe aber nicht weiter nachgeforscht.
MFGMP

Gast 21. Jul 2003 20:38

Re: vor runterfahren ein programm starten
 
Dann solltest du vielleicht endlich mal die Version deines OS lüften?!

Es überlebt eine Weile. Aber angenommen es geht um ein echtes Backup-Programm, so wird es wohl kaum in 5 Sekunden das Backup vollständig ausführen können.

moori 21. Jul 2003 21:45

Re: vor runterfahren ein programm starten
 
Tach,

hier die Prozedure mit der man einen Neustart/Logoff abfangen kann.

Delphi-Quellcode:
unit Unit1;
interface
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
  CheckBox1: TCheckBox;       // Nur zu Testzwecken...
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 
  private

  procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
  public
  end;


var
  Form1    : TForm1;

implementation
{$R *.DFM}

//Die Message wird nur erhalten, wenn das System runtergefahren wird.

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  inherited;    //wichtig    
// pack hier die Abfrage rein, ob das Backup fertig ist.
// wenn das System neugestartet werden darf, dann setze Result auf true
// ich hab das ganze hier mal mit ner checkbox gemacht.

  if form1.CheckBox1.Checked=true      // Checkbox = true => Reboot abgebrochen
          then message.Result:=0        // EndSession = False
               else message.Result:=1; // EndSession = True
  end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Backupprozeduren oder soo....

end;

end.
Mit Win2k und XP kein Problem, wies mit anderen Systemen aussieht musst du probieren.

Gruss Moori

MPirious 21. Jul 2003 21:48

Re: vor runterfahren ein programm starten
 
Hallo

zuerst einmal:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen } 
    procedure WMQUERYENDSESSION(var msg: TMessage); message WM_QUERYENDSESSION;
  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm} 

procedure TForm1.WMQUERYENDSESSION(var msg: TMessage);
begin
  ShowMessage('Windows wird beendet.');
  msg.Result := Integer(TRUE); //  TRUE: darf weiter runterfahren; FALSE: nicht runterfahren
end;
gefunden bei euch in der Code-Library

mein OS: WinXP
Es braucht nicht in 5 Sekunden abgeschlossen zu sein, da der Shutdownvorgang abgebrochen ist. Ich habe mein Programm gestartet, dann über [Start][Herunterfahren][Herunterfahren] Windows beendet. Es wurden ca. 10 Prozesse beendet, dann wurde der Shutdownvorgang abgebrochen. Ein Versuch den Vorgang (nach 2 Minuten) abzubrechen (shutdown - a in Kommandozeile) schlägt fehl mit "Das Herunterfahren des Systems konnte nicht abgebrochen werden, da das System zurzeit nicht heruntergefahren wird.

P.S. Falls ich (wieder einmal) etwas nicht beachtet habe, sagt es mir bitte, bin noch Anfänger. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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