catchしなかった例外が発生した際の ***は動作を停止しました「WerFault」を表示させない・表示させる

f:id:onsanai:20160912070612p:plain

問題が発生したため、プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はWindowsから通知されます。

を表示させないプログラムは以下のとおり。

#include <exception>
#include <Windows.h>
void main()
{
    SetErrorMode(SEM_NOGPFAULTERRORBOX);
    throw std::exception(); //例外を投げる
}

表示させたい場合は以下の通り。

#include <exception>
#include <Windows.h>
void main()
{
    SetErrorMode(0);//なくてもよいが
    throw std::exception(); //例外を投げる
}

ただし、レジストリで以下の設定をしておかないと SetErrorMode を変えても表示されないので注意

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Windows Error Reporting
Disabled DWORD 00000000
DontShowUI DOWRD 00000000

Windows Error Reporting がない場合は自分でキーを作成すべし。変更後は要再起動。

参照

SetErrorMode function (Windows)

逆引きWIN32API: 一般保護例外ダイアログを出さなくする方法 - seclan のほえほえルーム

[VC]子プロセスが落ちたのを検出する。(6) うずまき の なんとなくでいいのかも?

xxxEXEは動作を停止しました メッセージを表示させない | きりんの雑記