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

```txt:動作環境
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](https://qiita-image-store.s3.amazonaws.com/0/32870/f7cbbd52-eabe-88db-c7f9-8d75069146cc.png)

シャットダウン防止時
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8c7a107e-d0ba-13e4-433b-690be073d79b.png)

シャットダウン防止後
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/934660cb-d20a-ec44-cefb-b10c7b0438bb.png)


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

[c++ builder > shutdown処理 > XE4対応 > ログオフ](https://qiita.com/7of9/items/e1d6d039c8940d924404)

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

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

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

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


### 関連

[C++ Builder > シャットダウン時の処理 > WM_QUERYENDSESSION | WMQES.Result = false;「このプログラムによりシャットダウンできません」になる](https://qiita.com/7of9/items/3a79f6556155da48b35c)