コンソールを割り当てる
ウィンドウアプリケーションを作成しているときでも、printfやcoutのような
標準関数が使えるとデバッグなどで非常に便利です
しかし、以下のようなコードでは文字を出力することはできません
//標準出力ができないコード
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
printf("printfで出力\n");
cout<<"coutで出力"<<endl;
return 0;
}
printfやcoutを使っていますが当然文字は出力されません
そこでアプリケーション側からコンソールを割り当て、
そのコンソール画面に出力してやればprintfなどが使えます
まず、コンソールを割り当てるにはAllocConsole関数を使います
//AllocConsoleでコンソールを割り当てる
#include <windows.h>
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
::AllocConsole(); //コンソール割り当て
::MessageBox(NULL, TEXT("ストッパーです"), TEXT("AllocConsole"), MB_OK);
::FreeConsole(); //コンソールを解放します
return 0;
}
実行するとコンソール画面が表示されます

AllocConsoleで割り当てることができるコンソールは1つのプロセスにつき1つだけです
2回連続で呼び出しても1つの画面しかでてきません
すでに割り当てている場合は失敗します
メッセージボックスはプログラムが即座に終了しないためのストッパーです
コンソールを解放するためにはFreeConsoleを使います
FreeConsoleした後なら再びAllocConsoleで割り当てることができます
AllocConsoleが失敗すると0を返します
//AllocConsoleの割り当てテスト
#include <windows.h>
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
BOOL ret;
ret = ::AllocConsole(); //コンソール1割り当て
if(ret == 0)
::MessageBox(NULL, TEXT("コンソール1の割り当てに失敗"), TEXT("Error"), MB_OK);
else
::MessageBox(NULL, TEXT("コンソール1の割り当てに成功"), TEXT("OK"), MB_OK);
ret = ::AllocConsole(); //コンソール2割り当て
if(ret == 0)
::MessageBox(NULL, TEXT("コンソール2の割り当てに失敗"), TEXT("Error"), MB_OK);
else
::MessageBox(NULL, TEXT("コンソール2の割り当てに成功"), TEXT("OK"), MB_OK);
::FreeConsole(); //コンソールを解放します
ret = ::AllocConsole(); //コンソール3割り当て
if(ret == 0)
::MessageBox(NULL, TEXT("コンソール3の割り当てに失敗"), TEXT("Error"), MB_OK);
else
::MessageBox(NULL, TEXT("コンソール3の割り当てに成功"), TEXT("OK"), MB_OK);
::FreeConsole(); //コンソールを解放します
return 0;
}

コンソール1の割り当てには成功しますが、コンソール2の割り当てには失敗します
しかし、FreeConsoleした後のコンソール3の割り当てには成功します
AllocConsoleの戻り値の型はBOOLですが、MSDNによると
・関数が成功すると、0以外の値が返ります
・関数が失敗すると、0が返ります
ということなのでif(ret == FASLE)ではなく、if(ret == 0)にしています
これでコンソールを割り当てることができました
次は割り当てたコンソールに、標準出力を関連付けます
続き
TOP>プログラミング>コンソールを割り当てる