Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{1.}
function MyExitWindows(RebootParam: Longword): Boolean;
var
TTokenHd: THandle;
TTokenPvg: TTokenPrivileges;
cbtpPrevious: DWORD;
rTTokenPvg: TTokenPrivileges;
pcbtpPreviousRequired: DWORD;
tpResult: Boolean;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
if
Win32Platform = VER_PLATFORM_WIN32_NT then
begin
tpResult := OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY,
TTokenHd);
if
tpResult then
begin
tpResult := LookupPrivilegeValue(nil
,
SE_SHUTDOWN_NAME,
TTokenPvg.Privileges[0].Luid);
TTokenPvg.PrivilegeCount := 1;
TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
cbtpPrevious := SizeOf(rTTokenPvg);
pcbtpPreviousRequired := 0;
if
tpResult then
Windows.AdjustTokenPrivileges(TTokenHd,
False
,
TTokenPvg,
cbtpPrevious,
rTTokenPvg,
pcbtpPreviousRequired);
end
;
end
;
Result := ExitWindowsEx(RebootParam, 0);
end
;
// Example to shutdown Windows:
procedure TForm1.Button1Click(Sender: TObject);
begin
MyExitWindows(EWX_POWEROFF or
EWX_FORCE);
end
;
// Example to reboot Windows:
procedure TForm1.Button1Click(Sender: TObject);
begin
MyExitWindows(EWX_REBOOT or
EWX_FORCE);
end
;
// Parameters for MyExitWindows()
{************************************************************************}
{2. Console Shutdown Demo}
program Shutdown;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;
// Shutdown Program
// (c) 2000 NeuralAbyss Software
// www.neuralabyss.com
var
logoff: Boolean = False
;
reboot: Boolean = False
;
warn: Boolean = False
;
downQuick: Boolean = False
;
cancelShutdown: Boolean = False
;
powerOff: Boolean = False
;
timeDelay: Integer = 0;
function
HasParam(Opt: Char): Boolean;
var
x: Integer;
begin
Result := False
;
for
x := 1 to
ParamCount do
if
(ParamStr(x) = '-' + opt) or
(ParamStr(x) = '/' + opt) then
Result := True
;
end
;
function
GetErrorstring: string
;
var
lz: Cardinal;
err: array
[0..512] of
Char;
begin
lz := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil
, lz, 0, @err, 512, nil
);
Result := string
(err);
end
;
procedure
DoShutdown;
var
rl, flgs: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
flgs := 0;
if
downQuick then
flgs := flgs or
EWX_FORCE;
if
not
reboot then
flgs := flgs or
EWX_SHUTDOWN;
if
reboot then
flgs := flgs or
EWX_REBOOT;
if
poweroff and
(not
reboot) then
flgs := flgs or
EWX_POWEROFF;
if
logoff then
flgs := (flgs and
(not
(EWX_REBOOT or
EWX_SHUTDOWN or
EWX_POWEROFF))) or
EWX_LOGOFF;
if
Win32Platform = VER_PLATFORM_WIN32_NT then
begin
if
not
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY,
hToken) then
Writeln('Cannot open process token. [' + GetErrorstring + ']')
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
Writeln('Error adjusting process privileges.');
end
else
Writeln('Cannot find privilege value. [' + GetErrorstring + ']');
end
;
{ if CancelShutdown then
if AbortSystemShutdown(nil) = False then
Writeln('Cannot abort. [' + GetErrorstring + ']')
else
Writeln('Cancelled.')
else
begin
if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then
Writeln('Cannot go down. [' + GetErrorstring + ']')
else
Writeln('Shutting down!');
end;
}
end;
// else begin
ExitWindowsEx(flgs, 0);
// end;
end;
begin
Writeln('Shutdown v0.3 for Win32 (similar to the Linux version)');
Writeln('(c) 2000 NeuralAbyss Software. All Rights Reserved.');
if
HasParam('?') or
(ParamCount = 0) then
begin
Writeln('Usage: shutdown [-akrhfnc] [-t secs]');
Writeln(' -k: don''t really shutdown, only warn.');
Writeln(' -r: reboot after shutdown.');
Writeln(' -h: halt after shutdown.');
Writeln(' -p: power off after shutdown');
Writeln(' -l: log off only');
Writeln(' -n: kill apps that don''t want to die.');
Writeln(' -c: cancel a running shutdown.');
end
else
begin
if
HasParam('k') then
warn := True
;
if
HasParam('r') then
reboot := True
;
if
HasParam('h') and
reboot then
begin
Writeln('Error: Cannot specify -r and -h parameters together!');
Exit;
end
;
if
HasParam('h') then
reboot := False
;
if
HasParam('n') then
downQuick := True
;
if
HasParam('c') then
cancelShutdown := True
;
if
HasParam('p') then
powerOff := True
;
if
HasParam('l') then
logoff := True
;
DoShutdown;
end
;
end
.