2011-07-27 6 views
4

wxWidgetアプリケーションがWindowsのコンソール(Windows XP)でコンソールから起動するときに、例えば: "MyApplication.exeをコール"すると、std::cout << "xyz"は作成されません。 。それは全く出力を生成しません。代わりに、アプリケーションが正常に起動し、正常に動作します。フレーム上のすべてのボタンとウィジェットは機能しています。wxWidgetアプリケーションのcoutはありませんが、Eclipseの場合はうまく動作します

Eclipseからアプリケーションを実行すると、Eclipseのコンソールと同じように出力が生成されます。

Windowsコンソールで出力が表示されないのはなぜですか?私は何を活性化しなければならないのですか?

+0

一般アプリはコンソールアプリケーションやウィンドウのアプリのいずれかである - 決して両方。私はあなたがこの分野で経験のある人を見つけることを願っています。なぜなら、それはまれであるからです。 –

答えて

3

私はいつもこの好奇心てきたので、私はBo Persson's answerで提供されたリンクをたどっと一緒にいくつかのコードをつなぎ。それを使用するには、mainUseConsoleオブジェクトを定義してください。

UseConsole.h:

class UseConsole 
{ 
public: 
    UseConsole(); 
    ~UseConsole(); 
private: 
    bool m_good; 
}; 

UseConsole.cpp:

#include <windows.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <io.h> 
#include <iostream> 
#include <fstream> 

#include "UseConsole.h" 

// The following function is taken nearly verbatim from 
// http://www.halcyon.com/~ast/dload/guicon.htm 
void RedirectIOToConsole() 
{ 
    int hConHandle; 
    long lStdHandle; 
    FILE *fp; 

    // redirect unbuffered STDOUT to the console 
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 

    // redirect unbuffered STDIN to the console 
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 

    // redirect unbuffered STDERR to the console 
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
    // point to console as well 
    std::ios::sync_with_stdio(); 
} 

UseConsole::UseConsole() 
{ 
    m_good = !!AttachConsole(ATTACH_PARENT_PROCESS); 
    if (m_good) 
     RedirectIOToConsole(); 
} 

UseConsole::~UseConsole() 
{ 
    if (m_good) 
     FreeConsole(); 
} 
+0

私はいくつかの出力と一緒にこの例を試しました: 'std :: cout <<"出力をcoutにテストする "<< std :: endl; \t std :: cerr << "cerrへの出力をテストする" << std :: endl; STDである場合 をclog'する テスト出力をCERRする 'テスト出力:::コンソールに表示出力された' ; \tのstd :: << "目詰まりするテスト出力" <<はstd :: ENDLを詰まら鼻隠し? fprintfの出力はうまくいきます...混乱しています – Benjamin

+0

@Benjamin、私は '洞窟'が私のために働いたので混乱しています。 –

+0

最後に、他のコンピュータでも動作しますが、私の答えは受け入れました。私のために悪い、しかしあなたの例であなたは正しいです。ありがとう – Benjamin

2

デフォルトでウィンドウアプリケーションにはコンソールがありません。とにかく持っていればそれを作ることができます。 IDEで実行している場合、IDEは、多くの場合、あなたのためのことを行います

Visual C++ Enable Console

はこの質問への回答を参照してください。


すでにコンソールウィンドウが開いている場合は、代わりにAttachConsole(ATTACH_PARENT_PROCESS)を使用して、親プロセスのコンソールに接続することができます。

http://msdn.microsoft.com/en-us/library/ms681952(v=vs.85).aspx

+0

私はこの質問がコンソールから開始されたアプリケーションに関係していると思います。第2のコンソールを作成することは非生産的です。 –

+0

ああ、私はそれを逃した。代替機能へのリンクを追加しました。 –

関連する問題