关于win98程序控制关机的问题

yingshang 2004-10-12 01:13:52
procedure TzlUtils.ExitWindows32(AShutDownFlag: Word);
// ShutDownFlag in [EWX_REBOOT, EWX_SHUTDOWN, EWX_LOGOFF, EWX_POWEROFF]

function ChangeNTSecurityForShutdown: Boolean;
var
hToken : THandle;
tkp, Newt : TTokenPrivileges;
retlength : DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES +
TOKEN_QUERY, hToken) <> False then
begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
tkp.Privileges[0].Luid) = True then
begin
tkp.PrivilegeCount := 1; // One to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(hToken, False, tkp,
SizeOf(TTokenPrivileges),
Newt, retlength);
end;
end;
end;

begin
if Win32PlatForm = VER_PLATFORM_WIN32_NT then
begin
if ChangeNTSecurityForShutdown then
ExitWindowsEx(AShutDownFlag, 0);
end
else if Win32PlatForm = VER_PLATFORM_WIN32_WINDOWS then
ExitWindows(AShutDownFlag, 0);
end;

我用上面的函数在win2000或winxp都可以成功的关机、重起、注销,但是在win98下所有的操作都变成了注销,不知道为什么,请问各位大侠该如何解决?
...全文
113 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rex_love_Burger 2004-10-12
  • 打赏
  • 举报
回复
在win98中不需要提升权限,下面的函数适合所有Windows版本
function GetWinVersion: String;

var

VersionInfo : TOSVersionInfo;

OSName : String;

begin

// set the size of the record

VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );


if Windows.GetVersionEx( VersionInfo ) then

begin

with VersionInfo do

begin

case dwPlatformId of

VER_PLATFORM_WIN32s : OSName := 'Win32s';

VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';

VER_PLATFORM_WIN32_NT : OSName := 'Windows NT';

end; // case dwPlatformId

Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +

#13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';

end; // with VersionInfo

end // if GetVersionEx

else

Result := '';

end;


procedure ShutDown;

const

SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration

var

hToken : THandle;

tkp : TTokenPrivileges;

tkpo : TTokenPrivileges;

zero : DWORD;

begin

if Pos( 'Windows NT', GetWinVersion) = 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, 'Exit Error', '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, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );

Exit;

end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)



// SE_SHUTDOWN_NAME

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

begin

MessageBox( 0, 'Exit Error', '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, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );

Exit;

end // if Boolean( GetLastError() )

else

ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );

end // if OSVersion = 'Windows NT'

else

begin // just shut the machine down

ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );

end; // else

end;
yingshang 2004-10-12
  • 打赏
  • 举报
回复
else if Win32PlatForm = VER_PLATFORM_WIN32_WINDOWS then
ExitWindows(AShutDownFlag, 0);

请看这段,我不是用ExitWindows的吗?不行啊!
zwb666 2004-10-12
  • 打赏
  • 举报
回复
直接用ExitWindows
beyondsun 2004-10-12
  • 打赏
  • 举报
回复
直接用ExitWindows,不要提升权限了,NT系统才要提升咯.
yueyixing 2004-10-12
  • 打赏
  • 举报
回复
在98中是不需要提升权限的,直接使
yingshang 2004-10-12
  • 打赏
  • 举报
回复
顺便再问一个问题,在没有关机等操作的权限的时候,该如何关机、重起、注销?
一、项目简介 本项目(HF24075 SDFeatureRivertraining)是一套以多路 PWM 多彩 LED 灯光控制为核心的固件方案,基于 PADAUK PMS 系列单片机。方案对蓝、青、粉等多色 LED 进行独立 PWM 调光,实现呼吸、渐变、流水等细腻灯光效果,并支持按键切换与传感器交互。其 PWM 调光结构清晰,是学习单片机 PWM、色彩混合与灯光算法的理想范例。 核心应用场景: 1. 氛围灯 / 流水灯产品开发 2. PWM 调光与色彩混合学习 3. 电子类课程设计 / 毕业设计 4. 灯光艺术与 DIY 项目 适配使用场景:学习练手、毕业设计、课程设计、创业售卖、实操实训,突出实用性与可落地性。 二、硬件核心配置 · 主控芯片:PADAUK(应广科技)PMS 系列 8 位 OTP 单片机 · 外接外设: - 多色 LED 灯组(蓝 / 青 / 粉等多路独立 PWM) - 轻触按键(模式切换) - 传感器(交互触发) · 操控设备: - 机身实体按键操控 三、核心功能介绍 1. 多路独立 PWM 调光:蓝、青、粉等 LED 各自独立占空比控制,实现精准亮度; 2. 呼吸 / 渐变 / 流水效果:通过 PWM 变化曲线营造丰富灯光律动; 3. 按键切换模式:轻触在多种灯效间循环切换; 4. 传感器交互:外部传感信号触发或联动灯光变化; 5. 低功耗设计:闲置进入低功耗,按需唤醒。 6. 参数可配:亮灭周期、渐变速度等可调,便于定制。 四、项目优势与亮点 · 灯光细腻:多路独立 PWM,效果远胜简单开关灯。 · 算法清晰:呼吸 / 渐变实现简洁,易于理解与移植。 · 扩展性强:可轻松增加颜色与模式,适配各类灯饰。 ·

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧