Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Shutdown nach bestimmter Zeit (https://www.delphipraxis.net/102971-shutdown-nach-bestimmter-zeit.html)

FreakyF 7. Nov 2007 17:52


Shutdown nach bestimmter Zeit
 
Hallo!

Ich verwende folgenden Code, um den PC herunter zu fahren:

Delphi-Quellcode:
function ExWindows(const AFlag: Word): Boolean;
var
  vi    : TOSVersionInfo;
  hToken : THandle;
  tp    : TTokenPrivileges;
  h     : DWord;
begin
  flag:= EWX_Shutdown;
  result:= false;

  vi.dwOSVersionInfoSize:=SizeOf(vi);

  if GetVersionEx(vi) then
  begin
    if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
      // Windows NT
      // Achtung bei Delphi 2 muß @hToken stehen ...
      if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken) then
      begin
        LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
        tp.PrivilegeCount := 1;
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        h := 0;
        AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^, h);
        CloseHandle(hToken);
        result := ExitWindowsEx(Aflag, 0);
      end;
    end
    else
    begin // Windows 95
      Result := ExitWindowsEx(Aflag, 0);
    end;
  end;
end;
Wo/wie kann ich festlegen, dass der PC erst nach z.b. 1 Minute herunterfahren wird?


Vielen Dank

Markus

fLaSh11 7. Nov 2007 17:57

Re: Shutdown nach bestimmter Zeit
 
ruf doch einfach die shutdown.exe (param "-s" für herunterfahren) in C:\Windows\System32 auf und übergebe ihr den Parameter "-t 60"...

oder willst du unbedingt den Code da benutzen?

FreakyF 7. Nov 2007 18:02

Re: Shutdown nach bestimmter Zeit
 
Zitat:

Zitat von fLaSh11
ruf doch einfach die shutdown.exe (param "-s" für herunterfahren) in C:\Windows\System32 auf und übergebe ihr den Parameter "-t 60"...

oder willst du unbedingt den Code da benutzen?


Danke für die superschnelle Antwort.
Dein Vorschlag klingt interessant. Kannst du mir erklären, wie ich vorgehen muss?
Ich hab nicht gewusst, dass man überhaupt auf die shutdown.exe zugreifen kann...
Wichtig ist, dass das ganze in Delphi passiert.

Luckie 7. Nov 2007 18:13

Re: Shutdown nach bestimmter Zeit
 
Zitat:

Zitat von FreakyF
Wo/wie kann ich festlegen, dass der PC erst nach z.b. 1 Minute herunterfahren wird?

Es bleibt doch ganz dir überlassen, wann du diese Funktion aufrufst.

FreakyF 7. Nov 2007 18:32

Re: Shutdown nach bestimmter Zeit
 
Das Problem ist doch, dass man sich unter NT-Systemen erstmal die Rechte beschaffen muss.
Es wird doch nicht einfach reichen, die shutdown.exe über eine Delphi-Funktion aufzurufen oder?

Kann man mit dem Code, den ich oben angegeben habe, keine Zeit vergeben?

scrat1979 7. Nov 2007 18:33

Re: Shutdown nach bestimmter Zeit
 
Hallo!!!

Das ganze ist wirklich ganz einfach zu programmieren und noch zu erweitern (z.B. zu einer bestimmten Uhrzeit herunterfahren...) wenn Du folgendes macht (und bei DEINEM Code oben bleibst):

Hier mal ein Pseudocode (Unit DateUtils einbinden):

Delphi-Quellcode:
ShutDownDateTime : TDateTime;

[...]

ShutDownDateTime := AddMinutes(StrToInt(EditShutDownAfterXMinutes.Text), Now);

[...]
procedure Timer1OnTimer(Sender : TObject);
Begin
 If Now >= ShutDownDateTime Then Begin;
   // Hier Windows herunterfahren oder was auch immer...
 End;

End;
[...]
... zumindest so ähnlich, mal als Denkanstoß. Habe vor einigen Wochen ein selbiges Programm geschrieben, leider schon wieder gelöscht, sonst könnte ich Dir den Source posten.

SCRaT

FreakyF 7. Nov 2007 18:38

Re: Shutdown nach bestimmter Zeit
 
Der Aufruf der shutdown.exe würde dann folgendermaßen funktionieren?:

Delphi-Quellcode:
uses ShellAPI;

ShellExecute(Handle, 'open', PChar(C:\Windows\System32\shutdown.exe -s -m \\Rechnername -t %STime% -c "Herunterfahren des PCs" ), nil, nil, sw_Show);

FreakyF 7. Nov 2007 18:43

Re: Shutdown nach bestimmter Zeit
 
Zitat:

Zitat von scrat1979
Hallo!!!

Delphi-Quellcode:
ShutDownDateTime : TDateTime;

[...]

ShutDownDateTime := AddMinutes(StrToInt(EditShutDownAfterXMinutes.Text), Now);

[...]
procedure Timer1OnTimer(Sender : TObject);
Begin
 If Now >= ShutDownDateTime Then Begin;
   // Hier Windows herunterfahren oder was auch immer...
 End;

End;
[...]


SCRaT

Danke schon mal für deinen Tipp. Hab leider noch nicht ganz die Funktion verstanden.
Wenn jemand ein ähnliches Programm mit Code hat, dann würd ich mich darüber freuen :-D

Oder soll ich doch die Idee mit der shutdown.exe machen?


Markus

ringli 7. Nov 2007 18:47

Re: Shutdown nach bestimmter Zeit
 
Zitat:

Oder soll ich doch die Idee mit der shutdown.exe machen?
Ist nicht zu empfehlen da du unter Windows XP dafür Administratorrechte benötigst.

FreakyF 7. Nov 2007 18:53

Re: Shutdown nach bestimmter Zeit
 
Dann wärs schön, wenn mir jemand scrat1979's Vorschlag nochmal genauer erklären könnte.

Danke :roteyes:

scrat1979 7. Nov 2007 19:49

Re: Shutdown nach bestimmter Zeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von FreakyF
Dann wärs schön, wenn mir jemand scrat1979's Vorschlag nochmal genauer erklären könnte.

Danke :roteyes:

Ok, ich will ja nicht so sein, habe Dir gerade mal sein ein Ding zusammengeschustert, anbei auch die EXE, damit Du siehst was ich meine. Btw, keine Fehlerbehandlung oder sonstiger Schnickschnack :evil: :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DateUtils, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Timer1: TTimer;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ShutDownDateTime : TDateTime;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShutDownDateTime := IncMinute(now, StrToInt(Edit1.Text));
  Label2.Caption := 'Shutdown DateTime: ' + DateTimeToStr(ShutDownDateTime);
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label3.Caption := Format('ShutDown in %d Sekunden...', [SecondsBetween(now, ShutDownDateTime)]);
  if now >= ShutDownDateTime then Begin
      // "=" würde nicht reichen, der Timer wird ja nicht EXAKT am Endzeitpunkt ausgelöst, also auch auf Zeit später
         reagieren.
      Timer1.Enabled := False; // Nicht vergessen!!!!!!!!!!!!!!!!!!!!
      Label3.Caption := 'FERTIG!!!';
      showmessage('Hier was machen...');
  End;

end;

end.

FreakyF 8. Nov 2007 07:07

Re: Shutdown nach bestimmter Zeit
 
Vielen Dank scrat1979. Dein Programm hat mir wirklich weiterhelfen können. :-D

FreakyF 8. Nov 2007 07:10

Re: Shutdown nach bestimmter Zeit
 
Noch eine Frage zu dem Thema. Man hat mir gesagt, dass ich das ganze auch mit sleep() lösen kann.
Das hat auch geklappt.

Meine Frage ist, welche Methode jetzt "eleganter" bzw. sinnvoller ist?

scrat1979 8. Nov 2007 19:42

Re: Shutdown nach bestimmter Zeit
 
Zitat:

Zitat von FreakyF
Noch eine Frage zu dem Thema. Man hat mir gesagt, dass ich das ganze auch mit sleep() lösen kann.
Das hat auch geklappt.

Meine Frage ist, welche Methode jetzt "eleganter" bzw. sinnvoller ist?

Verdammt gute Frage. Ich meine, die Timer-Lösung ist wesentlich eleganter. Die Begründung müsstest Du selbst testen, da ich mit nicht sicher bin:

1. Schau mal die Prozessor-Auslastung während Sleep an (mehr?)
2. Wird WÄHREND dem Sleep das Programm (die Message-Queue) fortgesetzt? (Würde glaub dem Sinn von Sleep wiedersprechen). D.h. man würde während dem "Countdown" das PRogramm einfrieren.

Irgend etwas sagt mir aber, daß die Sleep()-Lösung unsauber ist. Da müssten mal die Cracks eine Begründung liefern oder mir widersprechen...

SCRaT

FreakyF 8. Nov 2007 21:59

Re: Shutdown nach bestimmter Zeit
 
Zitat:

Zitat von scrat1979
1. Schau mal die Prozessor-Auslastung während Sleep an (mehr?)

Dass Sleep nicht elegant ist, war mir klar. Ich frag mich nur, warum so wenig das sleep() verwenden, wo's doch viel simpler ist?
Prozessorauslastung ist bei mir so gering, dass ich nicht sagen kann, was in dieser Hinsicht besser ist


Zitat:

2. Wird WÄHREND dem Sleep das Programm (die Message-Queue) fortgesetzt? (Würde glaub dem Sinn von Sleep wiedersprechen). D.h. man würde während dem "Countdown" das PRogramm einfrieren.
Ich denke schon, dass das Programm während des sleeps() "steht".


Zitat:

Irgend etwas sagt mir aber, daß die Sleep()-Lösung unsauber ist. Da müssten mal die Cracks eine Begründung liefern oder mir widersprechen...
Ich bin auch schon gespannt :coder:

scrat1979 8. Nov 2007 22:14

Re: Shutdown nach bestimmter Zeit
 
Hmmm, also ich denke der große "Nachteil" des Sleep in diesem Fall ist wohl das einfrieren des Programmes, d.h. es kann nicht mehr auf Nachrichten (Mausklicks etc.) reagieren...

SCRaT


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 Uhr.

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