好象在Win2K和WinXP中需要将EWX_SHUTDOWN 和EWX_FORCE 一起使用。 下面是一个例子,改自VC if not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0) then error("ExitWindowsEx"); 在Win2k,NT,XP下你使用EWX_FORCE关闭了你所运行的进程,而系统级别的进程,并没有关闭,所以要关闭就要对系统发出EWX_SHUTDOWN 命令. 先试一试吧。
procedure TForm1.reboot; var VerInfo:TOSVersionInfo; hToken:THANDLE; tkp:TOKEN_PRIVILEGES; Nothing:Cardinal; begin VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo); GetVersionEx(VerInfo); if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then Begin OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken); LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount:= 1; tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing); End; // ExitWindowsEx(EWX_POWEROFF,0);//这句就是关机 ExitWindowsEx(EWX_REBOOT,0); end;
下面是一个例子,改自VC
if not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0) then
error("ExitWindowsEx"); 在Win2k,NT,XP下你使用EWX_FORCE关闭了你所运行的进程,而系统级别的进程,并没有关闭,所以要关闭就要对系统发出EWX_SHUTDOWN 命令.
先试一试吧。
var
VerInfo:TOSVersionInfo;
hToken:THANDLE;
tkp:TOKEN_PRIVILEGES;
Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
Begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
End;
// ExitWindowsEx(EWX_POWEROFF,0);//这句就是关机
ExitWindowsEx(EWX_REBOOT,0);
end;