ウィンドウアプリを作成していたが、途中でコンソールアプリに変更したい。そこで、printf などの関数を利用して標準出力へ出力したいのに、うまくいかない。どうもMFCアプリだとうまくいかないよう。今回は、元々がダイアログベースのアプリで起きたが、たぶん他の形態でも起こりそう。

解決方法: リンカのパラメータに /entry:"WinMainCRTStartup" と /subsystem:console を指定する。

VisualC++.Net の場合: [構成プロパティ] -> [リンカ] -> [詳細] -> [エントリポイント] に WinMainCRTStartup を指定。[構成プロパティ] -> [リンカ] -> [システム] -> [サブシステム] に コンソール(/SUBSYSTEM:CONSOLE) を指定。

AllocConsole を使うという方法もウェブで見かけるけど、これは別にコマンドプロンプトの窓が出現するタイプ。

AllocConsole();
freopen("con", "w", stdout);
printf("hello console");
FreeConsole();

ちなみに、ダイアログベースのアプリから、ダイアログを排除して、コンソール処理を利用する方法も以下。

CWinApp のサブクラス(CHogeApp) の InitInstance 関数内で CHogeDlg dlg; などと宣言されているので、これを含めて以下をバッサリ捨てて(コメントアウト)、替わりにコンソール対応のプログラムを埋め込む。

tags: VisualC++.Net zurazure

Posted by NI-Lab. (@nilab)