パスワードを忘れた? アカウント作成
452715 journal

novaの日記: ExitWindowsEx

日記 by nova

BCB6 で Windows を落す方法

 API 使うので BCB6 限定じゃないですけど。

ExitWindowsEx(EWX_SHUTDOWN, 0);

 第一引数のキーワードで落し方が換えられるみたい。

  • EWX_LOGOFF : ログオフ。

  • EWX_POWEROFF : シャットダウン後、電源断。

  • EWX_REBOOT : 再起動。

  • EWX_SHUTDOWN : シャットダウン後、電源を切れる状態にする。 ATX 電源だと EWX_POWEROFF と同じ動きになる。

  • EWX_FORCE : プロセスを問答無用で強制終了。単体だとログオフします。

 EWX_FORCE を他のキーワードと併用する場合は OR (|) で繋ぎます。

ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);

 ただし、NT カーネルの Windows の場合、EWX_LOGOFF 以外は権限の設定が必要らしいです。 権限設定のソースをパチってきたら普通に動きました。

//form に TButton x1, TRadioButton x5 を設置。
void __fastcall TmainForm::execClick(TObject *Sender)
{
 HANDLE hToken;
 LUID luid;
 TOKEN_PRIVILEGES tokenPrivileges;

 //アクセストークンをオープンする
 if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){
  if(LookupPrivilegeValue("", SE_SHUTDOWN_NAME, &luid)){
   //SE_SHUTDOWN_NAME 特権を有効にする
   tokenPrivileges.PrivilegeCount = 1;
   tokenPrivileges.Privileges[0].Luid = luid;
   tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, NULL, NULL, NULL);
   if(GetLastError() == ERROR_SUCCESS){
    //windows の終了。
    if(LOGOFF->Checked == true)ExitWindowsEx(EWX_LOGOFF, 0);
    if(POWEROFF->Checked == true)ExitWindowsEx(EWX_POWEROFF, 0);
    if(REBOOT->Checked == true)ExitWindowsEx(EWX_REBOOT, 0);
    if(SHUTDOWN->Checked == true)ExitWindowsEx(EWX_SHUTDOWN, 0);
    if(FORCE->Checked == true)ExitWindowsEx(EWX_FORCE, 0);
   }
   CloseHandle(hToken);
  }
 }
}
//---------------------------------------------------------------------------

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

読み込み中...