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;とやっとけば大丈夫だと思います。