OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

Windowアプリでコンソールを起動する

 おやじプログラマはprintf()でのデバッグが大好きです。(笑)

main()で始まるコンソールアプリでは標準出力のコンソールが自動的に起動されますが、winmain()ではじまるWindowアプリでは自力でコンソールを起動する必要があります。

-コンソールの起動方法

{//起動
AllocConsole(); FILE* fp; freopen_s(&fp, "CONOUT$","w", stdout); freopen_s(&fp, "CONIN$", "r", stdin); } {//開放 FreeConsole(); }

基本的にはこれだけです。

お行儀として,コンソールを起動しないときは

{//標準出力をnullデバイスにしておく
    FILE* fp;
    freopen_s(&fp, "/dev/null", "w", stdout);
    freopen_s(&fp, "/dev/null", "r", stdin);//これは不要かも
}
		

としておくと、プログラム中のprintf()文は捨てらます。(多分こうやらなくても勝手に捨てられると思いますが。。)

さらに、もうひとつ注意点はコンソールウィンドウを起動した状態でシャットダウンやスタンバイモードに移行するような場合、通常のウィンドウの場合は通知メッセージの処理となるのですが、コンソールウィンドウの場合はハンドラが呼び出されます。ハンドラの定義がないとそのまま例外となるので注意が必要。

ハンドラの定義は、

//シグナルハンドラ例
BOOL WINAPI SignalHandler(DWORD dwCtrlType)
{
    if(dwCtrlType == CTRL_SHUTDOWN_EVENT){//シャットダウン?
        if(main_Wind != NULL){
            main_Wind->SendMessage(WM_CLOSE);
        }
    }
    return TRUE;
}
	
{//シグナルハンドラ
	::SetConsoleCtrlHandler(SignalHandler, TRUE);
}
		

ハンドラは最低限return TRUE;とやっとけば大丈夫だと思います。