在C++ Builder程序中控制Windows关机的问题。

cxxer 2010-07-06 06:42:46
Windows XP sp2, C++ Builder6下:

  1.运行C++ Builder系统后,先激活选单“File/New Application”,创建一个新工程。
  2.激活选单“File/Save As”把窗体单元以文件名exitu.cpp存盘,然后激活选单“File/Save Project As”把工程文件以文件名exitp.bpr存盘。(注意:工程文件名与窗体单元文件名不要同名。)
  3.在窗体上增加四个TButton组件Button1、Button2、Button3和Button4,分别设置它们的Caption属性为“其它身份登录”、“关机”、“重新启动”和“强制关机”。
  4.分别设置Button1、Button2、Button3和Button4组件的OnClick事件响应代码如下:


  void __fastcall TForm1::Button1Click(TObject Sender)

  {

   //其它身份登录

   DWORD temp;

   ExitWindowsEx(EWX_LOGOFF,temp);

  }

  //------------------------------

  void __fastcall TForm1::Button2Click(TObject Sender)

  {

   //关机

   DWORD temp;

   ExitWindowsEx(EWX_SHUTDOWN,temp);

  }

  //------------------------------

  void __fastcall TForm1::Button3Click(TObject Sender)

  {

   //重新启动

   DWORD temp;

   ExitWindowsEx(EWX_REBOOT,temp);

  }

  //------------------------------

  void __fastcall TForm1::Button4Click(TObject Sender)

  {

   //强制关机

   DWORD temp;

   ExitWindowsEx(EWX_FORCE,temp);

  }


问题:为什么程序运行只能注销,不能实现其他功能?
...全文
66 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2010-07-06
  • 打赏
  • 举报
回复
在Windows NT以上的系统中,进程需要有SE_SHUTDOWN_NAME权限才能关机:

HANDLE hToken;
TOKEN_PRIVILEGES tkp;

if (!::OpenProcessToken(::GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return;

::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

if (::GetLastError() != ERROR_SUCCESS)
ShowMessage("AdjustTokenPrivileges Error");

if (!::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
ShowMessage("ExitWindowsEx Error");
zhgwbzhd 2010-07-06
  • 打赏
  • 举报
回复
提高权限。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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