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

概要

この記事には、Windows システムにおけるコンソールアプリケーションについて、調べて分かった事を書いています。

導入

Windows システムにおいて、アプリケーションは二つに分類されます。自分ではウィンドウを作らずコマンドプロンプトの上で動作するコンソールアプリケーションと、自分でウィンドウを作る Windows アプリケーションです(以後、アプリケーションを「アプリ」と省略)。

CUI の世界 ~ 標準ストリーム

少し脱線しましょう。CUI (Command-line User Interface)とは UNIX や MS-DOS のように、キーボードを使ってコンピュータへの命令を文字列で書き表し、それをコンピュータへ送信して実行させる、という形式でコンピュータを操作するインターフェイスを指します。CUI の世界では、入力した命令や実行した命令の結果がコンピュータの画面に順に表示されていきます。Windows のコマンドプロンプトは、このコンピュータの画面を擬似的に表現したものです。そのため、コマンドプロンプトの画面は昔の UNIX システム端末になぞらえて「コンソール(あるいはターミナル)」と呼ばれます。すなわち「コンソールアプリケーション」という名前は、コンソール=コマンドプロンプトの上で動くアプリケーション、という意味になっているわけです。

CUI のアプリは、コンピュータの画面に結果を表示したり、ユーザの入力を受け取る必要があります。ところで、「左上から右へと順に表示する」という決め事さえすれば、画面への文字出力は一文字の出力を繰り返す事で実現できます。またユーザの入力についても、キーボードを一文字一文字順番に押していると考えられます。したがって画面への出入力ともに、長い直線型のデータ構造を形成する事になるのですが、追加される情報に限りはありませんので、コンピュータの限界を超えないよう、「ところてん」式に古い情報を捨てていく必要があります。このような構造を、川の流れにたとえてストリームと呼びます。長い川の中の一部分だけを見ている、という例えですね。とりわけ、画面への「出力」、ユーザの「入力」、さらに「エラー出力」というものは、合わせて「標準ストリーム」などと呼ばれています。

CUI の世界では、「パイプ」や「リダイレクト」といった概念があり、

違い

コンソールアプリは基本的にコマンドプロンプト上で動かす事を前提に設計されます。コマンドプロンプトで CMD からコンソールアプリを起動すると、そのコマンドプロンプトの画面を使って動作します。そしてアプリが終了すると、制御をシェルに返します(次の入力プロンプトが表示される)。これに対してエクスプローラなどからコンソールアプリを直接起動すると、新しくコマンドプロンプトが現れ、その画面を使ってアプリが動作します。

コンソールアプリからウィンドウを作る API を呼んでウィンドウを作ると、実は Windows アプリと同じようなアプリを作れます。すると、コンソールアプリでも GUI アプリを作れるのですね。であるならば、Windows アプリとコンソールアプリの違いなど無いのではないか?という疑問が出てきます。

今度は逆に、Windows アプリをコマンドプロンプトから実行してみます。するとコンソールアプリを実行した場合とは異なり、コマンドプロンプトは起動したアプリの終了を待たずに次の入力プロンプトを表示します。この動作は、よくよく考えると奇妙です。