パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
Code::BlocksのToolsメニュー

統合開発環境Code::Blocksメニューへの外部ツール登録方法を説明する。

本サイトの利用する統合開発環境Code::Blocksはメニュー[Tools]あるいは[Tools+]のサブメニューに任意の外部ツールを登録できる。[Tools]は当初より組み込まれていて、[Tools+]が後にプラグインとして追加されたものと思われる。デフォルトで[Tools]と[Tools+]は共に表示されるが、[Tools+|Configure Tools]の[User-defined Tools]ダイアログで[Plugin Settings|Replace Tools menu with Tools Plus]をチェックすれば[Tools+]が[Tools]に置き換わる。

外部ツールはビルド時にプレ/ポストビルドステップとして自動実行させることもできる。

サブメニューのグルーピング

[Tools]、[Tools+]共に外部ツールを登録したサブメニューをグルーピングできるが方法が異なる。

  • [Tools]はサブメニューが1階層のみだがセパレータを追加できる。
  • [Tools+]はサブメニューを多階層化できるがセパレータは追加できない。

外部ツール起動オプション

[Tools]、[Tools+]共に外部ツール毎に起動オプションを設定する。起動オプションはコンソールアプリケーションの標準出力先を設定するものとして名称が付けられている。ウィンドウズデスクトップアプリケーションも登録できるがその挙動はオプション名称から推測できない。コンソールアプリケーションとデスクトップアプリケーションの定義は後述する。

[Tools]の外部ツール起動オプションは[Tools|Configure Tools]の[User-defined tools]ダイアログで追加された外部ツールを選択し、[Edit]を押して表示される[Edit tool]ダイアログの[Launching options]のラジオボタンから選択する。[Tools+]の場合は[Tools+|Configure Tools]の[User-defined Tools]ダイアログで[Known Tools]で外部ツールを選択し、[Output to]ドロップダウンリストで選択する。

コンソールアプリケーション

以下に外部ツールとしてコンソールアプリケーションを用いる場合の挙動を示す。

メニュー オプション 出力先 メッセージループ ツール終了時
[Tools] Launch tool in a new console window and wait for a keypress when done コマンドプロンプト アタッチ 一時停止
Launch tool hidden with standard output redirect [Logs & others|Code::Blocks] アタッチ 終了
Launch tool visible (without output redirection) コマンドプロンプト アタッチ 終了
Launch tool visible detached (without output redirection) コマンドプロンプト デタッチ 終了
[Tools+] Tools Output Window [Tool Output] デタッチ 終了
Code::Blocks Console コマンドプロンプト デタッチ 一時停止
Standard Shell コマンドプロンプト デタッチ 終了

出力先は新たに作成されるコマンドプロンプト、あるいはCode::Blocks内の[Logs & others|Code::Blocks]ウィンドウまたは[Tool Output]ウィンドウへのリダイレクトである。メッセージループアタッチはCode::Blocksメッセージループがツールの終了を待つ場合を、デタッチは待たない場合を示す。これをデタッチとすれば複数のツールを同時に起動できる。出力先がコマンドプロンプトの場合、ツール終了時に一時停止しないとコマンドプロンプトが閉じて出力を確認できない。Code::Blocks内ウィンドウの場合は出力はウィンドウに残り一時停止の必要は無い。

以下に出力先の日本語ウィンドウズにおける(より正確にはシステムロケールを日本語とした場合の)文字コードと標準入力の可否を示す。

出力先 文字コード 標準入力
コマンドプロンプト CP932
[Logs & others|Code::Blocks] CP932 不可
[Tool Output] ASCII 可(バグ有)

[Logs & others|Code::Blocks]ウィンドウ出力でツールが標準入力を要求すると入力手段が無くツールはハングアップ状態になる。[Tool Output]ウィンドウは表示できる文字コードがASCIIに限定され、それ以外の文字は正しく表示されない。[Tool Output]ウィンドウは入力可能ながらキーコードの扱いが怪しく使用に耐えない。

ウィンドウズの予約済み名"CON"を持つファイルへの出力はコマンドプロンプトへ直接書き込まれるが、標準出力と異なりリダイレクトできずコマンドプロンプト以外で表示できない。

#include <iostream>
#include <fstream>
int main()
{
std::cout<<"Output to standard output."<<std::endl;
std::ofstream{"CON"}<<"Output to \"CON\" file."<<std::endl;
return 0;
}

デスクトップアプリケーション

以下に外部ツールとしてデスクトップアプリケーションを用いる場合の挙動を示す。デスクトップアプリケーションはデフォルトで標準入出力を持たないので出力先に意味は無い。コマンドプロンプトの代わりに自らのメインウィンドウが表示されるが、終了時一時停止とする場合に限りコマンドプロンプトも表示される。メッセージループアタッチの場合Code::Blocksスレッドはコンソールアプリケーション同様にデスクトップアプリケーションの終了を待つ。

メニュー オプション 表示 メッセージループ ツール終了時
[Tools] Launch tool in a new console window and wait for a keypress when done コマンドプロンプト+メインウィンドウ アタッチ 一時停止
Launch tool hidden with standard output redirect 非表示 アタッチ 終了
Launch tool visible (without output redirection) メインウィンドウ アタッチ 終了
Launch tool visible detached (without output redirection) メインウィンドウ デタッチ 終了
[Tools+] Tools Output Window 非表示 デタッチ 終了
Code::Blocks Console コマンドプロンプト+メインウィンドウ デタッチ 一時停止
Standard Shell メインウィンドウ デタッチ 終了

[Tools|...|Launch tool hidden with standard output redirect]あるいは[Tools+|...|Tools Output Window]はデスクトップアプリケーションを非表示で起動するという好ましくない事態を招くが、これは外部ツールがコンソールアプリケーションであることを前提としているためである。すなわちCode::Blocksは標準出力を自らのウィンドウへリダイレクトし、不要となるコマンドプロンプトを隠そうとしてアプリケーションを非表示で起動する。これを表示で起動させるには新たなコマンドプロンプト(非表示で起動する)を介すれば良い。

cmd /c Desktop1.exe

コンソールアプリケーションとデスクトップアプリケーション

以下にコンソールアプリケーションとデスクトップアプリケーションの違いを記述する。なお本サイトは暗黙でコマンドプロンプトとコンソールを区別をしないが、ここでは議論の正確性を期して区別する事にする。

既にあるコマンドプロンプトからコンソールアプリケーションを起動すると、アプリケーションはそのコンソールにアタッチされコマンドプロンプトはアプリケーションの終了を待つ。一方GUIを前提とするデスクトップアプリケーションはコンソールにアタッチされずコマンドプロンプトはアプリケーションの終了を待たず復帰する。コマンドプロンプトを用いずにコンソールアプリケーションを起動すると、オペレーティングシステムは新たなコンソールを作成しアプリケーションをそのコンソールにアタッチする。一方デスクトップアプリケーションはコンソールを作成せずどのコンソールにもアタッチされない。

このようにデフォルトにおいてコンソールアプリケーションは必ずコンソールにアタッチされ標準入出力を持つが、デスクトップアプリケーションは標準入出力を持たない。

覚え書き
ここで言う"コンソールへのアタッチ/デタッチ"と先に出てきた"メッセージループへのアタッチ/デタッチ"を混乱しないよう注意の事。

オペレーティングシステムはコンソールアプリケーションとデスクトップアプリケーションの判別を実行ファイルPEヘッダSubsystem値のみで判別する。GUIやメッセージループの有無は全く関係しない。

本サイトの使用するコンパイラmingw-w64はコンパイラオプション(正確にはリンカオプション)-mwindowsでPEヘッダSubsystem値を変更し、ターゲットをコンソールアプリケーションとするか(-mwindows無し)デスクトップアプリケーションとするか(-mwindows有り)を切り替える。Code::Blocksは通常このオプションを[Project|Properties]の[Project/targets options]ダイアログ[Build targets]ページ[Build targets]でターゲット毎に[Selected build target options|Type]でGUI applicationあるいはConsole applicationを選択することで設定する。

GUIを持つコンソールアプリケーション

デスクトップアプリケーションのソースコードを-mwindowsオプション無し([...|Selected build target options|Type]でConsole applicationを選択)でビルドすればGUIを持つコンソールアプリケーションとなる。自作ツールのKAutoVerとKGitWVerはそういったアプリケーションである。GUIを持つコンソールアプリケーションはコンソールにアタッチされ標準入出力を持つが、自らのウィンドウは表示/非表示を含めデスクトップアプリケーションとして振る舞う。