Shutdown

Tags:    delphi

Closed

[Redigeret d. 05/11-03 17:32:31 af Jesper]



2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Hey jeg er igang med at lave et program der slukker computeren... men har nogle problemer:
1. Kan ikke finde ud af at lave det sårn at man kan vægle tiden den skal slukke
2. at den viser hvor lang tid der er tilbage.

nogle der lige kan hjælpe og give mig en forklaring?

Her er koden fuldt:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

end.


function TimedShutDown(Computer: string; Msg: string; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin

if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
ShowMessage('Cannot open process token.')
else
begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
if GetLastError <> ERROR_SUCCESS then
ShowMessage('Error adjusting process privileges.');
end
else
ShowMessage('Cannot find privilege value.');
end;

Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
end;

//Start shut down
procedure TForm1.Button1Click(Sender: TObject);
begin
if not TimedShutDown('\\\\computername', 'you have to shutdown', 30, true, true) then
ShowMessage('function failed...');
end;

//Abort shut down
procedure TForm1.Button2Click(Sender: TObject);
begin
AbortSystemShutdown('\\\\computername');
end;

Hej,

Hvis det bare er din egen maskine som du vil slukke/genstarte så skal du ikke angive noget computer navn.

Hvis du ændre parameteret Computer til PChar i stedet for String i funktionen TimedShutDown:
Fold kodeboks ind/udKode 


Når du så vil lukke din egen computer (som programmet kører på) så skriver du:
Fold kodeboks ind/udKode 


Alt dette fungere fint hos mig.

Her er en forklaring af funktionen:


OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

Her henter vi den aktuelle process' (vores applikation) rettigheder.


LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid)

Se om vi kan finde værdien for "shutdown" i de rettigheder vi lige har hentet.


tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);

Hvis vi fandt rettighederne, sætter vi den så vi er sikker på at vi kan få lov til at lukke/genstarte


Result := InitiateSystemShutdown(Computer, PChar(Msg), Time, Force, Reboot)

Og endelig prøver vi at lukke ned.


AbortSystemShutdown(nil);

Her stopper vi en ventende nedlukning/genstart...

Håber det hjælper dig en smule på vej.
/Michael.




Men hvordan kan jeg så vægle hvor lang tid der skal gå inden den lukker (og hvor den viser at den nedtæller) ??

håber ikke det er alt for besværligt spørsmål... startede nemlig for 3 måneder siden :)



t