[Windows] console modeとno console modeの切り替え

Windows上のアプリケーションソフトウェアをconsoleからとGUIからとの両方のモードに対応させる方法を調べたのでメモ。

インターネット上でよくまとまっていて正しそうな情報は以下の2つ。前者から後者への言及がある。

http://stackoverflow.com/questions/493536/can-one-executable-be-both-a-console-and-gui-app

http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68531.aspx

後者の要旨は以下のような感じ:

GUIアプリケーションはメッセージループとウィンドウ(少なくとも1個)を持ち、Consoleアプリケーションはその両方を持たない。アプリケーションはそのいずれかになっている。入力があればConsoleアプリケーションのようにふるまい、なければGUIアプリケーションのようにふるまうというコードを書くことで切り替え問題を回避する人もいる。visual studioやildasmは両方をサポートしているように見える。その構造はそれぞれ独特。

visual studioは、devenv.com(これはConsoleアプリケーション)とdevenv.exe(GUIアプリケーション)の2つのバイナリに分かれており、devenv(何も指定してない)で起動すると、Win32アプリケーションの探索の順番で devenv.comが先に見つかる。そのとき入力がないと判断するとdevenv.comはdevenv.exeを起動し自分は終了する。

ildasm.exeは1つのバイナリしかない。最初にGUIアプリケーションとしてコンパイルしたのち、editbin.exeによりConsoleアプリケーションとしてマークされる(この操作はstackoverflowのanswerを書いた人によれば不要。開発環境で同じことができるはずとのこと)。自分の中でConsoleアプリケーションになるかどうかを判断し、GUIを使う場合は自分をGUIアプリケーションとして再起動している。

stackoverflowの回答は上記の方法の詳細を検討し、結論としては、二通りのバイナリを作るか、Consoleウィンドウが一瞬ちらつく(アプリケーション内で起動しなおすなどの方法)のを選ぶか、どちらかより悪くない方を選択して実装すればいいよ、ということらしい。

バイナリの起動時にOSがどのサブシステムを使うかを決定しているので、起動後にアプリケーションの都合でそれを切り替えることができない、という構造的な問題でもあるようだ。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。