不需要汇编语言
使用API就行了
我给你DELPHI5在WIN2K的关机FUNCTIONProcedure Shutdown(Flag:integer);
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
//OSVersion='Windows NT';
var
MyVerInfo : TOSVersionInfo;
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
OSversion : String;begin
MyVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(MyVerInfo); case MyVerInfo.dwPlatformId of
VER_PLATFORM_WIN32s: OsVersion:='WINDOWS 98';
VER_PLATFORM_WIN32_WINDOWS: OsVersion:='WINDOWS 98';
VER_PLATFORM_WIN32_NT: OsVersion:='Windows NT';
end; if OSVERSION='WINDOWS 98' then
begin
case flag of
0: ExitWindowsEx(EWX_REBOOT or EWX_SHUTDOWN, 0 );//重新启动
1: ExitWindowsEx(EWX_LOGOFF, 0 );//退出重新登陆
2: ExitWindowsEx(EWX_POWEROFF, 0 );//用EWX_FORCE是强制关闭
3: ExitWindowsEx(EWX_FORCE or EWX_POWEROFF, 0 ); //强制关机
end;
exit;
end; if Pos( 'Windows NT', OSVersion ) = 1 then // we've got to do a whole buch of things
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, '错误!', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, '错误!', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, '错误!', 'LookupPrivilegeValue() Failed', MB_OK );
Exit;
end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero );
if Boolean(GetLastError()) then
begin
MessageBox( 0, '错误!', 'AdjustTokenPrivileges() Failed', MB_OK );
Exit;
end // if Boolean( GetLastError() )
else
case flag of
0: ExitWindowsEx(EWX_REBOOT or EWX_SHUTDOWN, 0 );//重新启动
1: ExitWindowsEx(EWX_LOGOFF, 0 );//退出重新登陆
2: ExitWindowsEx(EWX_POWEROFF, 0 );//用EWX_FORCE是强制关闭
3: ExitWindowsEx(EWX_FORCE or EWX_POWEROFF, 0 ); //强制关机
end;
end; // if OSVersion = 'Windows NT'end;
使用API就行了
我给你DELPHI5在WIN2K的关机FUNCTIONProcedure Shutdown(Flag:integer);
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
//OSVersion='Windows NT';
var
MyVerInfo : TOSVersionInfo;
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
OSversion : String;begin
MyVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(MyVerInfo); case MyVerInfo.dwPlatformId of
VER_PLATFORM_WIN32s: OsVersion:='WINDOWS 98';
VER_PLATFORM_WIN32_WINDOWS: OsVersion:='WINDOWS 98';
VER_PLATFORM_WIN32_NT: OsVersion:='Windows NT';
end; if OSVERSION='WINDOWS 98' then
begin
case flag of
0: ExitWindowsEx(EWX_REBOOT or EWX_SHUTDOWN, 0 );//重新启动
1: ExitWindowsEx(EWX_LOGOFF, 0 );//退出重新登陆
2: ExitWindowsEx(EWX_POWEROFF, 0 );//用EWX_FORCE是强制关闭
3: ExitWindowsEx(EWX_FORCE or EWX_POWEROFF, 0 ); //强制关机
end;
exit;
end; if Pos( 'Windows NT', OSVersion ) = 1 then // we've got to do a whole buch of things
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, '错误!', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, '错误!', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, '错误!', 'LookupPrivilegeValue() Failed', MB_OK );
Exit;
end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero );
if Boolean(GetLastError()) then
begin
MessageBox( 0, '错误!', 'AdjustTokenPrivileges() Failed', MB_OK );
Exit;
end // if Boolean( GetLastError() )
else
case flag of
0: ExitWindowsEx(EWX_REBOOT or EWX_SHUTDOWN, 0 );//重新启动
1: ExitWindowsEx(EWX_LOGOFF, 0 );//退出重新登陆
2: ExitWindowsEx(EWX_POWEROFF, 0 );//用EWX_FORCE是强制关闭
3: ExitWindowsEx(EWX_FORCE or EWX_POWEROFF, 0 ); //强制关机
end;
end; // if OSVersion = 'Windows NT'end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货