NEWBEI,ASK:请问在WINNT下,如何关闭系统,(use delphi)(50分)

  • 主题发起人 主题发起人 billhang
  • 开始时间 开始时间
B

billhang

Unregistered / Unconfirmed
GUEST, unregistred user!
NEWBEI,ASK:
请问在WINNT下,如何关闭系统,(use delphi)
本人使用 EXITWINDOWSEX()
但如何调用AdjustTokenPrivileges,
请指教?
 
有控件要吗?
 
procedure ExitWindowsNT(uFlags : integer);
var
hToken : THANDLE;
tkp, tkDumb : TTokenPrivileges;
DumbInt : integer;
begin
FillChar(tkp, sizeof(tkp), 0);
// Get a token for this process
if not (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken)) then
raise Exception.create('OpenProcessToken failed with code '
+ inttostr(GetLastError));

// Get the LUID for the Shutdown privilege
LookupPrivilegeValue(nil, pchar('SeShutdownPrivilege'),
tkp.Privileges[0].Luid);

tkp.PrivilegeCount := 1; // one privilege to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

// Get the shutdown provolege for this process
AdjustTokenPrivileges(hToken, false, tkp, sizeof(tkDumb), tkDumb, DumbInt);

// Cannot test the return value of AdjustTokenPrivileges
if GetLastError <> ERROR_SUCCESS then
Raise Exception.create('AdjustTokenPrivileges failed with code '
+ inttostr(GetLastError));

// shut down the system and for all applications to close
if not ExitWindowsEx(uFlags, 0) then
Raise Exception.create('ExitWindowsEx failed with code '
+ inttostr(GetLastError));
end;

调用方法:
ExitWindowsNT(EWX_SHUTDOWN or EWX_FORCE)
ExitWindowsNT(EWX_REBOOT)等等
 
THANK ALL FIRST !

本人在执行 温柔一刀 的代码时:
there is no overloaded version of 'adjustTokenPrivileges' that can be called with these arguments

请指教!
 
那是因为不同版本的Delphi对WinAPI声明参数类型不完全一致,
你找到adjustTokenPrivileges的声明,把上面程序中的相应变量
改为相应参数的类型就应该没问题了。

我用的是D5,这个函数还是从老版本改过来的呢!
 
接受答案了.
 
后退
顶部