GUI プログラムでコンソールを使用する(標準出力)

GUIプログラムでは、コンソールが無いため、

printf() でデバッグ情報などを出力することができない。

出せると、かなり便利なんだけど、、、

ということで、出し方。

AllocConsole() で、コンソールを表示して、

freopen() で、標準出力をコンソールにリダイレクトして、

printf() で、コンソールに文字列を出力できるようになる。

使い終わったら、 FreeConsole() でコンソールを破棄。

コンソールは、OSで管理されているので、

2回割り当てようとしても、失敗して AllocConsole() が FALSE を返すだけ。

結構気軽に使える。

使いやすいように、クラスにまとめてみました ↓

--- StdoutConsole.h ファイル
#pragma once

class CStdoutConsole
{
public:
    static bool Allocate()
    {
        if(m_stdfp == 0)
        {
            if(AllocConsole())
            {
                m_stdfp = freopen 括弧始め "CON", "w", stdout); // 標準出力の割り当て
                if(m_stdfp)
                {
                    return true;
                }
                else
                {
                    FreeConsole();
                }
            }
            return false;
        }
    }

    static bool Free()
    {
        if(m_stdfp != 0)
        {
            fclose(m_stdfp);
            m_stdfp = 0;

            if(FreeConsole())
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    
    static bool IsConsole()
    {
        return m_stdfp != 0;
    }
private:
    CStdoutConsole(){}    // 構築・破棄を不可能にする。スタティックのみを使わせるため。
    ~CStdoutConsole(){}
    
    static FILE* m_stdfp;
};


--- StdoutConsole.c ファイル

#include <Windows.h>
#include <stdio.h>
#include "StdoutConsole.h"
FILE* CStdoutConsole::m_stdfp = 0;


※括弧始め を ( に書き換える必要があります。
(エキブロの制限で open と 括弧を続けて書けないため)

ちなみに、クラスにしたのは、ファイルポインタのデータの置き場に困ったため。

関数だけだと、生成・破棄のときに同じファイルポインタを使わないといけないから。

グローバル変数は使いたくないし、、、

モジュールレベル変数(static)にするだけじゃ、芸が無いし、、、

ということで、パブリック・スタティックなメンバだけを公開したクラスにしてみました。

ちゃんちゃん。
[PR]
by isoq | 2010-01-04 19:55 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< REGZA 42Z9000 買... strtok() のスマートな使い方 >>