2011-08-15 21 views
8

popenを使用してコマンドの出力を取得すると、dirと表示され、コンソールが表示されます。コンソールなしのC++ popenコマンド

しかし、コンソールの外観を持たないコマンドの出力は得られますか?

私はVisual C++を使用していて、いくつかのコマンドの出力、たとえばdirを返すようにライブラリを作成したいとします。 POSIXで

+4

あなたはどのプラットフォーム/ツールチェーンを使用していますか? – Flexo

+2

あなたはどのOSを使用していますか?これは適切なOSでは発生しません。 Linuxですが、たとえばWindowsの下でcygwin? –

+0

これがWindowsの場合(これは何年も前から数多く戦ってきたので100%確信しています)、唯一信頼できる方法はCreateProcessです。他のほとんどのライブラリは、子コンソールが開くのを防ぐために必要なフラグをスキップします。 –

答えて

2

それはこのようなものでなければなりません。(これは、この動作が流行している唯一のプラットフォームであるため)あなたがコースを外れ、戻り値などをチェックする必要があります

//Create the pipe. 
int lsOutPipe[2]; 
pipe(lsOutPipe); 

//Fork to two processes. 
pid_t lsPid=fork(); 

//Check if I'm the child or parent. 
if (0 == lsPid) 
{//I'm the child. 
    //Close the read end of the pipe. 
    close(lsOutPipe[0]); 

    //Make the pipe be my stdout. 
    dup2(lsOutPipe[1],STDOUT_FILENO); 

    //Replace my self with ls (using one of the exec() functions): 
    exec("ls"....);//This never returns. 
} // if 

//I'm the parent. 
//Close the read side of the pipe. 
close(lsOutPipe[1]); 

//Read stuff from ls: 
char buffer[1024]; 
int bytesRead; 
do 
{ 
    bytesRead = read(emacsInPipe[0], buffer, 1024); 

    // Do something with the read information. 
    if (bytesRead > 0) printf(buffer, bytesRead); 
} while (bytesRead > 0); 

...

+0

パイプとは何ですか? Visual Studioはこの単語を強調表示しました。 – user883434

+0

含まれるライブラリはありますか? – user883434

+0

私はそれらの型を知らないいくつかの変数があります... – user883434

5

のWindowsと仮定すると、通信に必要なパイプを作成するには

CreatePipe()、子プロセスを作成するにはCreateProcessです。

HANDLE StdInHandles[2]; 
HANDLE StdOutHandles[2]; 
HANDLE StdErrHandles[2]; 

CreatePipe(&StdInHandles[0], &StdInHandles[1], NULL, 4096); 
CreatePipe(&StdOutHandles[0], &StdOutHandles[1], NULL, 4096); 
CreatePipe(&StdErrHandles[0], &StdErrHandles[1], NULL, 4096); 


STARTUPINFO si; memset(&si, 0, sizeof(si)); /* zero out */ 

si.dwFlags = STARTF_USESTDHANDLES; 
si.hStdInput = StdInHandles[0]; /* read handle */ 
si.hStdOutput = StdOutHandles[1]; /* write handle */ 
si.hStdError = StdErrHandles[1]; /* write handle */ 

/* fix other stuff in si */ 

PROCESS_INFORMATION pi; 
/* fix stuff in pi */ 


CreateProcess(AppName, commandline, SECURITY_ATTRIBUTES, SECURITY_ATTRIBUTES, FALSE, CREATE_NO_WINDOW |DETACHED_PROCESS, lpEnvironment, lpCurrentDirectory, &si, &pi); 

これは、達成したいことを達成するための方法以上のものです。

+2

申し訳ありません。必要なライブラリは何ですか? – user883434

+0

MSDNのドキュメントへのリンクは、どのヘッダーとライブラリを含めるべきかを正確に示していますが、この場合のライブラリはWIN32 kernel32ライブラリです。 –

+0

便利ですが、別のフラグを使用して動作させる必要がありました。これを見てください:http://stackoverflow.com/a/16953192/453673 – Nav

1

フルスクリーンのOpenGL Windowsアプリケーションでこれを解決する必要がありましたが、コンソールウィンドウがポップアップするのを防ぐことができませんでした。代わりに、少し遅れてフォーカスを取り戻すことは、それを見るのを避けるほど十分にうまくいくように思えます。

_popen(cmd, "wb"); 

Sleep(100); 

ShowWindow(hWnd, SW_SHOWDEFAULT); 
SetForegroundWindow(hWnd); 

アップデート:プログラムがエクスプローラから起動された場合、これは明らかに機能しません。 Visual Studioから起動すると動作します。

関連する問題