割り当てたコンソールを関連付ける


AllocConsoleでコンソールを割り当て、コンソールウィンドウを開くことができました
しかし、まだ標準出力関数を使っても表示はされません
//割り当てたコンソールには出力されないことを確認するコード
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    ::AllocConsole();     //コンソール割り当て
    printf("printfで出力\n");
    cout<<"coutで出力"<<endl;
    ::MessageBox(NULL, TEXT("ストッパーです"), TEXT("AllocConsole"), MB_OK);
    ::FreeConsole();      //コンソールを解放します
    
    return 0;
}
割り当てたコンソール画面に文字は出力されません

コンソールに出力するには、標準出力を指定する必要があります
//標準出力を指定し、標準出力関数を使ってみる
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    int hConsole;

    ::AllocConsole();     //コンソール割り当て

    hConsole = ::_open_osfhandle((intptr_t)::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    *stdout = *::_tfdopen(hConsole, TEXT("w"));
    ::setvbuf(stdout, NULL, _IONBF, 0);

    printf("printfで出力\n");
    cout<<"coutで出力"<<endl;

    ::MessageBox(NULL, TEXT("ストッパーです"), TEXT("AllocConsole"), MB_OK);
    ::FreeConsole();      //コンソールを解放します
    ::_close(hConsole);   //ハンドルを閉じます

    return 0;
}
標準出力指定

io.hとfcntl.hをインクルードします
GetStdHandle関数で標準出力のハンドルを取得します
_open_osfhandle関数でファイル記述子を割り当てます
そのファイル記述子と出力先を関連付けます
setvbufはバッファリングのモードなどを指定します
_open_osfhandleで開いたファイルは_closeで閉じます

これでコンソール画面に標準出力できるようになりました
このような処理を最初に宣言しておけば関数の呼び出し先でも有効です
//関数から標準関数を使ってみる
#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;

void func1()
{
    cout<<"func1呼び出し"<<endl;
}

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    int hConsole;

    ::AllocConsole();     //コンソール割り当て

    hConsole = ::_open_osfhandle((intptr_t)::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    *stdout = *::_tfdopen(hConsole, TEXT("w"));
    ::setvbuf(stdout, NULL, _IONBF, 0);

    func1();
    
    ::MessageBox(NULL, TEXT("ストッパーです"), TEXT("AllocConsole"), MB_OK);
    ::FreeConsole();      //コンソールを解放します
    ::_close(hConsole);   //ハンドルを閉じます

    return 0;
}
関数から標準関数呼び出し

コンソール画面に「func1呼び出し」と表示されます
処理を関数やクラスにまとめておいて、プログラムの開始と終わりに呼び出すようにしておけば
簡単に標準出力関数が使えます

次は、コンソールの割り込みについてです

続き


TOPプログラミング>割り当てたコンソールを関連付ける