2009-07-26 7 views
1

プロセスを実行し、プロセスが終了するのを待ってから、標準出力を文字列として返すのが最も簡単な方法は何ですか?プロセスを実行し、その標準出力をVC++で返します

Perlの親和性のあるバックグラウンド。

クロスプラットフォームのものは探していません。 VC++のための最も速いソリューションが必要です。

アイデア?

答えて

4

WinAPIのソリューション:

あなたはあなたのパイプ(CreatePipeを参照してください)にリダイレクト入力(STARTUPINFO構造体のhStdInputフィールド)と出力(hStdOutput)でプロセスを(のCreateProcessを参照)を作成する必要が

、その後、ちょうどパイプから読み込みます(ReadFileを参照してください)。

+0

これはVCでバッククエストを実行する最も単純な方法ですが、私には衝撃的です。http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx これは何百もの行ですコードの! –

2

うーん... MSDNは、例としてこれを持っている:

int main(void) 
{ 

    char psBuffer[128]; 
    FILE *pPipe; 

     /* Run DIR so that it writes its output to a pipe. Open this 
     * pipe with read text attribute so that we can read it 
     * like a text file. 
     */ 

    if((pPipe = _popen("dir *.c /on /p", "rt")) == NULL) 
     exit(1); 

    /* Read pipe until end of file, or an error occurs. */ 

    while(fgets(psBuffer, 128, pPipe)) 
    { 
     printf(psBuffer); 
    } 


    /* Close pipe and print return value of pPipe. */ 
    if (feof(pPipe)) 
    { 
    printf("\nProcess returned %d\n", _pclose(pPipe)); 
    } 
    else 
    { 
    printf("Error: Failed to read the pipe to the end.\n"); 
    } 
} 

は十分に簡単に思えます。それをC++の良さで包み込む必要があります。

+4

MSDNから引用するには、「Windowsプログラムで使用すると、_popen関数はプログラムが無期限にハングする無効なファイルポインタを返します。それがあれば、コンソールアプリケーションでも動作します。 –

+0

まあ、コンソールアプリは確かに私が実行しようとしているものです。しかし、あなたのコメントは重要です..多分もっと堅牢な解決策が必要です。 –

+0

Neil、実際には、私は上記の "notepad.exe"を試してみました。メモ帳を閉じて戻るまで待っています... –

関連する問題