![]() |
SDK-MFC 備忘録 |
Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)
おやじプログラマは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;とやっとけば大丈夫だと思います。