コンソールを割り当てる


ウィンドウアプリケーションを作成しているときでも、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呼び出し

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 コンソール3

コンソール1の割り当てには成功しますが、コンソール2の割り当てには失敗します
しかし、FreeConsoleした後のコンソール3の割り当てには成功します

AllocConsoleの戻り値の型はBOOLですが、MSDNによると
・関数が成功すると、0以外の値が返ります
・関数が失敗すると、0が返ります
ということなのでif(ret == FASLE)ではなく、if(ret == 0)にしています

これでコンソールを割り当てることができました
次は割り当てたコンソールに、標準出力を関連付けます

続き


TOPプログラミング>コンソールを割り当てる