Windowsアプリケーションでprintf:裏技編 [日記]
(前回までのあらすじ)
Windowsアプリケーションでコマンドプロンプトに文字を出力するには、AllocConsole(AttachConsole)
とfreopen
で出来るけど、AllocConsole
は必ずもう1つコマンドプロンプトが開くし、AttachConsole
はXP以降専用なので、どっちもいまいち。
さて。
Windowsアプリケーションでコマンドプロンプトへの出力が出来ないのは、標準出力が何処にも割り当てられていないから。
だから、freopen()
で再割り当てを行ったわけですが、別の方法で割り当てが出来ればいいんじゃないかと思いついたのです。
で、コマンドプロンプトから、こんなコマンドを入力してみました。
window_app.exe < input_file > output_file
おぉ、ちゃんと動いてる。
リダイレクトが出来るなら、パイプだって可能なはず。
ということで、
(cygwin等の)UNIX like tool があれば、
次の様にコマンド入力すれば、特に何もしなくても、
Windowsアプリケーションで、標準入力から入力して、標準出力へ出力できます。
(printfやgetcharが普通に使える)
cat | window_app.exe | cat
入出力先は、コマンドを入力したコマンドプロンプトです。
これを利用して、隠しログ出力機能が実装できそうだ。
今日の一冊 | |
|
2006-09-30 08:51
nice!(0)
コメント(2)
トラックバック(0)
大変古い記事にコメント失礼致します。
当方も現在、AttachConsole() & freopen()でWindowベースアプリケーションから起動元のConsoleに標準出力し、バッチファイルなどで使用できるようにしたいと考えておりますが、この方法だとConsole上に確かに表示はできるのですが、window_app.exe > test.txt のようにリダイレクトできずにいます。(表示されるだけ)
> だから、freopen()で再割り当てを行ったわけですが、
> 別の方法で割り当てが出来ればいいんじゃないかと思いついたのです。
ちなみに、とありますが、「別の方法」とはどのような方法だったのでしょうか。
申し訳ありませんが、よろしくお願い致します。
by ヴァリウム男爵 (2016-11-08 11:22)
このページに書いてある事が「別の方法」です。
状況が不明なところもあるのですが
AttachConsole() & freopen() でコンソールに出力出来るようにしたプログラムを、更に window_app.exe > test.txt でリダイレクトしたけど失敗したということでしょうか?
それだと、失敗します(多分)。
理屈から行けば、
プログラム起動時にリダイレクト機能により標準出力を test.txt に切り替えた後に、
プログラム内で freopen() で 標準出力をコンソールに切り替え直しているわけですから。
このページに書かれているように、(freopen() とかせずに) ただリダイレクトするだけでうまく行くのではないでしょうか?
ただ、
タイトルに「裏技編」とあるように当時たまたま成功しただけかも知れず、
OSや開発環境が変われば失敗に終わる可能性も十分にあります。
(日付的に当時の環境は Windows2000 + VisualStudio2003のはず)
by 晶紀 (2016-11-09 21:05)