2011-07-09 9 views
3

、私はコンソール/ Telnetを持っていると思います(型)クローン。私は基本的にディレクトリ内のすべてのファイルを読み取り、ディレクトリを変更できる作業ディレクトリシステムを持っています。私は簡単なFTPプロトコルを設定しています。しかし、私は任意の標準的な入力/出力プロシージャを使用して、プログラムによってさまざまなプログラムを自由に話したいと思います。私はDLLの注入技術やその他の方法に反対していません。これは良質のプログラムです。可能であれば、私はコンソールを簡単に直接使うことができたらすばらしいでしょう。 (システム()が動作する可能性がありますが、これは通信の継続や出力の読み返しを許可しません)グラブプログラムのコンソール出力

これまでPATH環境変数を取得してstdコマンド(ipconfig、netstatなど) )私のネットワーキング・ライブラリは、通信が容易になりますが、私はちょうどプログラムのコンソールとのインタフェースするかどうかはわかりません...

TL; DR:

は、プログラム間の標準的なコンソール通信のいずれかの定義済みの方法があります。 ?

答えて

5

ジェリーが述べたように、あなたが探しているのはパイプ(CreatePipe)です。そのうち2つは実際には入力用と出力用の2つです。次に、STARTUPINFOにstdin/stdout/stderrとして設定された新しいプロセスをCreateProcessに渡します。その後、WriteFile,ReadFilePeekNamedPipeと友人と通信することができます。

完全な例は、MSDNで提供されています:

http://msdn.microsoft.com/en-us/library/ms682499(v=vs.85).aspx

そして、あなたは(幸いにもレイモンドチェンはちょうど最近、文書化することが起こった)これらの一般的な落とし穴に落ちていないことを確認してください:

PSこれは、subprocessモジュールを搭載したPythonではずっと簡単です。

+0

ありがとうございました!私は前にパイプを見ましたが、まだ、私はそれらと何もしていません。これで十分です。ありがとうございました)! – ultifinitus

4

最も簡単な方法は通常、子プログラムを_popenで生成することです。これは、子の標準入力に書き込むハンドルを与えるか、子の標準出力から読み込むハンドルを与えます。

あなたが両方を行う必要がある場合、物事は急いでたくさん醜くなる。あなたは通常、匿名のパイプを自分で作成し、CreateProcessへの呼び出しで指定する必要があります。これは率直に言って痛みです。

+0

に見て、感謝! – ultifinitus

2

申し訳ありませんが、私はこのことについて少し勉強しました。さて、これはすべての罰金とダンディですが、

STARTUPINFO startInfo; 

    PROCESS_INFORMATION procInfo; 

    memset((void*) &startInfo, 0, sizeof (startInfo)); 
    memset((void*) &procInfo, 0, sizeof (procInfo)); 

    startInfo.cb = sizeof (startInfo); 
    startInfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW); 

    startInfo.wShowWindow = SW_HIDE; //No Console Window, Thanks. 

    startInfo.hStdInput = (HANDLE)inHandle; 
    startInfo.hStdOutput = (HANDLE)outHandle; 
    startInfo.hStdError = (HANDLE)errHandle; 

    char* pe = "cmd\0"; 
    //This is the program to execute (eg: c:\\Windows\\System32\\cmd.exe) 

    CreateProcess(NULL,pe,NULL,NULL,TRUE,0,NULL,NULL,&startInfo,&procInfo); 

    return procInfo.hProcess; 

:そしてここで何人かの人々が有用見つけることがいくつかの情報=]

コードは、標準入力/アウト/ ERRとしてパイプ/ファイルディスクリプタでプロセスを作成するのですここに私を本当に助けてくれたちょっとした情報があります。あなたのハンドル(in/out/err)にファイル記述子を使うことができるので、変更なしでストレートソケットを使うことができ、プロセスの入出力に直接アクセスできます。 cmdを呼び出して子プログラムのための

だから、隠されたコンソールを作成するための私の現在の方法は、局部的に2つのソケットを接続することで、その後、stdInputとしてソケットのいずれかを使用& & stdOutput & & STDERROR記述子。すばやく簡単です。

あなたが一緒にいくつかのソケットを接続する方法がわからない場合は、ただ単に私が必要な正確な情報についてですbeej's guide

+0

フラグを追加するために '+'を使うべきではありません。必ず '|'を使用してください。一部のフラグが重複し、予期しない結果が生じることがあります。 – kichik

+0

ops、あなたは正しいです、私はそれに応じて編集します。 – ultifinitus

関連する問題