teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/06/15 14:06

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -14,4 +14,25 @@
14
14
 
15
15
  > ■ メインウィンドウは GUIタイプだが、サブウィンドウ(複数) は コンソールタイプとして複数のコンソールを持つ方法
16
16
 
17
- できません。コンソールウィンドウは一つのプロセスで一つしか作れないという仕様になっています。
17
+ できません。コンソールウィンドウは一つのプロセスで一つしか作れないという仕様になっています。
18
+
19
+ ---
20
+ 追記
21
+
22
+ どうやらコマンドプロンプトとMinGWのシェルでは、GUIアプリ(サブシステムがWINDOWS)を実行する際の挙動が違うようです。MinGWのシェルはコマンドラインツールしか使ったことがなかったので、今まで知りませんでした。
23
+
24
+ コマンドプロンプトでは、GUIアプリには標準入出力用のハンドルが渡されません。そのため、パイプやリダイレクトも無視されます。実行すると終了を待たずにすぐにプロンプトに戻るのでそういう仕様にしているのだと思います。
25
+
26
+ 一方MinGWのシェルでは、GUIアプリにも標準入出力用のハンドルが渡されます。実行すると終了するまで制御が戻らないのは、おそらくそのためでしょう。GUIアプリでprintfしてみたら、普通に出力されていましたし、リダイレクトも有効でした。
27
+ (ご質問時にうまくできなかったのはコマンドプロンプトで実行したからでしょうか?)
28
+
29
+ ということを踏まえて、
30
+
31
+ > ■ CUI + GUI
32
+ > ■ GUI のみ
33
+ > ■ CUI のみ ( 今回はスルー )
34
+
35
+ このように、状況に応じてコンソールウィンドウを開いたり開かなかったり、といったことをするには、とりあえず、MinGWのシェルを使うことが前提であれば、特に難しいことを考えることなくGUIとGUI+CUIの切り替えが実現可能だと思います。エクスプローラーで起動したときにコンソールウィンドウを表示したいという場合は、`AllocConsole`関数を使う方法で良いかと思います。
36
+
37
+ 一方コマンドプロンプトで同じようなことをさせるのはかなり難しいと思います。コンソールアプリにすると、エクスプローラーで起動したときに必ずコンソールウィンドウが開きますし、GUIアプリではコンソールへの出力はできてもリダイレクトはできません。
38
+ GUIアプリに加えてコマンドプロンプトからの起動用のCUIアプリも作る(そしてパイプで受け渡し)、といったことをする必要があるかもしれません。