LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder XE4, 10.2 Tokyo > tool > ShutdownBlocker > シャットダウン開始テストでシャットダウンさせない (EWX_FORCEがない場合のみ)

Last updated at Posted at 2017-10-25
動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

背景

  • シャットダウン機能の実装
  • シャットダウンテスト開始
    • OS終了
  • 再起動
  • IDEの立ち上げ
  • SmartGitの起動
  • Sublimt Textの起動
  • やる気起動

この時間を短縮したい。

ShutdownBlocker

Unit1.dfm
object Form1: TForm1
  Left = 0
  Top = 0
  BorderStyle = bsDialog
  Caption = 'Shutdown Blocker'
  ClientHeight = 108
  ClientWidth = 645
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  PixelsPerInch = 96
  TextHeight = 13
  object L_message: TLabel
    Left = 32
    Top = 32
    Width = 78
    Height = 19
    Caption = 'L_message'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
  end
end
Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE で管理されるコンポーネント
    TLabel *L_message;
private:    // ユーザー宣言
public:     // ユーザー宣言
    void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES);
    __fastcall TForm1(TComponent* Owner);

BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION,TWMQueryEndSession,WMQueryEndSession);
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    L_message->Caption = L"";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES)
{
        // 希望の処理をここに書く

    L_message->Caption = L"Self-destruct sequence is deactivated.";

    WMQES.Result = false;  // これがあることにより、「このプログラムによりシャットダウンできません」になる
}

使用例 > スタートメニュー > シャットダウン

以下において、操作を間違うとOSがシャットダウンします

  1. ShutdownBlocker起動
  2. シャットダウしてみる
    • シャットダウンがブロックされる
    • ShutdownBlockerにメッセージが表示される
  3. 「キャンセル」を押す

シャットダウン防止前
qiita.png

シャットダウン防止時
qiita.png

シャットダウン防止後
qiita.png

使用例 > プログラムでのシャットダウン

c++ builder > shutdown処理 > XE4対応 > ログオフ

リンクのようなコードを実行したところ、ブロックされずにシャットダウンしてしまった

if(!ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE, 0 )) {
のようにEWX_FORCEが付いている場合は「強制的にシャットダウン」と同じ処理になってしまう。

運用時を考慮するとEWX_FORCEをなくした実装はしないため、ShutdownBlocker でシャットダウン防止できない、ということが分かった。

IDE動作時は実行時引数などによりシャットダウン処理はせず、実機動作時は通常のシャットダウンを行う、というような流れになりそう。

関連

C++ Builder > シャットダウン時の処理 > WM_QUERYENDSESSION | WMQES.Result = false;「このプログラムによりシャットダウンできません」になる

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1