tool
testing
cppBuilder
#migrated

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

動作環境
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;「このプログラムによりシャットダウンできません」になる