8

同様の質問から微妙ではあるが重要な変更があるため、重複として閉じないでください。

プロセスを作成せず、プロセス名だけを知っている場合、Java で外部プロセス (つまり stdout) の出力をキャプチャすることは可能ですか?

Windows 7で実行しています。

編集:

他の言語 (C#\C++) でそれを行う方法がある場合は、出力をキャプチャする「CaptureOutput」プログラムを記述し、stdout に書き込み、Java コードで「CaptureOutput」を起動してその stdput を読み取ることができます。

醜いですが、うまくいくかもしれません。

だから、他の言語で答えても大丈夫です。

4

4 に答える 4

1

あなたがやろうとしていることはかなり危険です。入ろうとしているプロセスのメモリを誤って破損するのは非常に簡単です。テスト、テスト、テスト。次に、さらにテストします。そして幸運を祈ります。

この記事 - API フック- 必要なものを (C++ を使用して) 開始する方法について説明します。実行中のプロセスにコードを挿入したら、STDOUT を置き換える他の Windows API 呼び出しがあります ( SetStdHandle など)。

于 2012-09-27T19:54:22.557 に答える
1

まず、あなたが求めていることは、プロセス分離のすべてのルールを破っていると言わせてください。プロセスが出力をキャプチャしたいプロセスを作成せず、呼び出しプロセスを変更するアクセス権も持っていない場合 (コマンド シェル? サービス マネージャー? あなたはどちらを言っていませんか)。次に、唯一のチャンスは、せいぜいわずかなものですが、プロセスにスレッドを挿入し、他のすべてのスレッドが中断されている間に、グローバル stdout (および stderr?) を変更することです。これは、ターゲット プロセスへのフル アクセス権限を持つプロセスによってのみ実行できます。実行中のプロセスでこのような操作を実行することは、気弱な人向けではありません。

于 2012-08-12T00:03:01.093 に答える
0

プロセスの開始時期を制御できますか? もしそうなら、プロセスを開始し、そのstdoutを読み取り可能なファイルにパイプするか、データベース、イベントビューアーなどに記録できる別のプログラムにパイプすることができます.

于 2012-08-02T12:38:55.900 に答える
0

Linux では、メッセージ キュー、パイプ、共有メモリ、ソケットなど、オペレーティング システムの IPC メカニズムを確認してください。これらのメカニズムにより、プロセス間通信が可能になります。ただし、プログラムの出力に特に関心がある場合は、回避策として、最初のプロセスでデータをディスクからファイルに出力し、別のプロセスで読み取ることができます。このようにして、タスクに複数の言語を使用できます。簡単な例として、C++ でデータをファイルに書き出し、JAVA を使用してそのデータを読み取り/使用するというものがあります。もしあったとしても、私が答えに近づいたことを願っています。

于 2012-09-15T11:59:06.797 に答える