SSブログ

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

入出力先は、コマンドを入力したコマンドプロンプトです。

これを利用して、隠しログ出力機能が実装できそうだ。

[車(セダン)] 今日の一冊
世にも恐ろしい世界史の迷宮

世にも恐ろしい世界史の迷宮

  • 作者: 桐生 操
  • 出版社/メーカー: PHP研究所
  • 発売日: 1999/05
  • メディア: 単行本

タグ:Windows VisualC++
nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

ヴァリウム男爵

大変古い記事にコメント失礼致します。

当方も現在、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) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。